0

このトピックについて多くの質問があることは知っていますが、私が試した例はどれもうまくいきませんでした。

次のように構築された既存の XML ドキュメントがあります。

<root>
    <ElementA>
        <element1>sometext</element1>
        <element2>sometext</element2>
        <element3>sometext</element3>
    </ElementA>

    <ElementA>
        <element1>sometext</element1>
        <element2>sometext</element2>
        <element3>sometext</element3>
    </ElementA>

    <ElementB>
        <element1>sometext</element1>
        <element2>sometext</element2>
        <element3>sometext</element3>
        <element4>sometext</element4>
        <element5>sometext</element5>
    </ElementB>

    <ElementB>
        <element1>sometext</element1>
        <element2>sometext</element2>
        <element3>sometext</element3>
        <element4>sometext</element4>
        <element5>sometext</element5>
    </ElementB>

    <ElementC>
        <element1>sometext</element1>
        <element2>sometext</element3>
    </ElementC>

    <ElementC>
        <element1>sometext</element1>
        <element2>sometext</element2>
    </ElementC>
</root>

すべての ElementA、B、および C を見つけて、それぞれの要素の子要素に対応するプロパティを持つタイプ objA などの新しいオブジェクトを作成する必要があります。以下は、私が試したコード例です。

var doc = XElement.Load(filename);
var data = from ele in doc.Elements()
           where ele.Name.LocalName.Equals("ElementA")
           select new objA
           {
                name = ele.Element("element1").Value
                address = ele.Element("element2").Value
           };

しかし、「データ」コレクションを反復しようとすると、null 例外エラーがスローされます。私は何を理解していませんか?

4

1 に答える 1

1

次を使用して、名前で要素を取得できますElements("tagName")

var data = from ele in doc.Elements("ElementA")
           select new objA
           {
               name = (string)ele.Element("element1"),
               address = (string)ele.Element("element2")
           };

また、要素が XML に存在しない場合を回避するために、(string)XElementInstanceの代わりに, を使用する必要があります。XElementInstance.ValueNullReferenceException

上に貼り付けたコードは、サンプル入力データの 2 つの要素を返します。

于 2013-03-24T14:25:38.763 に答える