0

したがって、次のような XML があります。

<a>
    <b c="1" ></b>
    <b c="2" ></b>
    <b c="3" ></b>
    <b c="4" ></b>
</a>

DataContractSerializer を使用して wp7 でこれをデシリアライズしたいのです。

この XML を追加のタグで囲み、ルート レベルから < a > をプッシュするなどのトリックなしでは、それを行うことは不可能であるという意見に出くわしました。
本当ですか?

あなたの要求に応じて、私はいくつかのコードを追加しています

クラス:

[KnownType(typeof(B))]
[DataContract(Namespace = "")]
public class A:List<B>
{
    [DataMember]
    public List<B> B
    {
        List<B> _b = new List<B>();
        get { return _b; }
        set { _b = value; }
    }
}

[DataContract(Namespace = "")]
public class B
{
    [DataMember]
    public string c = "foo";
}

逆シリアル化:

var serializer = new DataContractSerializer(typeof(A));
var o = serializer.ReadObject(SomeResponseStream);

そして、これの他の多くのバリエーション
ちなみに、このクラスの配置は、次のように XML にシリアライズされます。

<a>
    <b>
        <b c="1" ></b>
        <b c="2" ></b>
        <b c="3" ></b>
        <b c="4" ></b>
    </b>
</a>

< b > の追加の望ましくないレベルに注意してください

4

1 に答える 1

1

コメントで述べたように、Linq2Xml はより良い方法になる可能性があります

string xml = @"
<a>
    <b>
        <b c=""1"" ></b>
        <b c=""2"" ></b>
        <b c=""3"" ></b>
        <b c=""4"" ></b>
    </b>
</a>";

var bs = XDocument.Parse(xml)
                    .Root
                    .Element("b")
                    .Elements("b")
                    .Select(b => new B { c = b.Attribute("c").Value })
                    .ToList();

.

public class B
{
    public string c = "foo";
}
于 2013-09-03T19:13:37.060 に答える