1

XDocument の内容は以下の XML です。

List() を取得したいのですが、このメッセージの最後を参照してください。

<myXml>
  <myDatas code="01">
    <myVar name="myvar" value="A" />
    <myData name="A" value="A1" />
    <myData name="B" value="B1" />
  </myDatas>
  <myDatas code="02">
    <myVar name="myvar" value="B" />
    <myData name="A" value="A2" />
    <myData name="D" value="D2" />
  </myDatas>
</myXml>

public class MyData
{
    public string MainCode { get; set; }
    public string Code { get; set; }
    public string Value { get; set; }
}

List() が欲しいのですが、このコンテンツは次のようになります。

new MyData { MainCode = "01"; Code = "A"; Value = "A1" };
new MyData { MainCode = "01"; Code = "B"; Value = "B1" };
new MyData { MainCode = "02"; Code = "A"; Value = "A2" };
new MyData { MainCode = "02"; Code = "D"; Value = "D2" };
4

1 に答える 1

7

確かに-次のようなものが必要です:

var query = from datas in doc.Root.Elements("myDatas")
            let code = (string) datas.Attribute("code")
            from data in datas.Elements("myData")
            select new MyData {
                MainCode = code,
                Code = (string) data.Attribute("name"),
                Value = (string) data.Attribute("value"),
            };

var list = query.ToList();

from結果を平坦化するための複数の句に注意してください。

もう 1 つの方法は、すべての「リーフ」要素を見つけて、親からコード部分をフェッチすることでした。

var query = from data in doc.Descendants("myData")
            select new MyData {
                MainCode = (string) data.Parent.Attribute("code"),
                Code = (string) data.Attribute("name"),
                Value = (string) data.Attribute("value"),
            };

var list = query.ToList();

編集:ドキュメントが名前空間を使用している場合、それも簡単です:

XNamespace ns = "http://the-uri-of-the-namespace";
var query = from data in doc.Descendants(ns + "myData")
            ...

これはXName operator +(XNamespace, string)オーバーロードされた演算子を使用します。

于 2013-02-26T21:06:12.197 に答える