0

私は次のXMLファイルを持っています:

<Invoice_Ack>
    <Invoices>
        <Invoice>
            <Invoice_Number>123456</Invoice_Number>
            <Status>Rejected</Status>
            <Detail_Errors>
                <Detail_Error>
                    <ErrorID>0001</ErrorID>
                    <ErrorMessage>This is the error message</ErrorMessage>
                </Detail_Error>
                <Detail_Error>
                    <ErrorID>0502</ErrorID>
                    <ErrorMessage>This is another error message</ErrorMessage>
                </Detail_Error>
            </Detail_Errors>
        </Invoice>
    </Invoices>
</Invoice_Ack>

次のコードで「Invoice_Number」ノードと「Status」ノードにアクセスできますが、「ErrorMessage」ノードを取得する方法もわかりません。これが私が持っているものです:

XDocument doc = XDocument.Load(file);

foreach(var invoice in doc.Descendants("Invoice"))
{
    string status = invoice.Element("Status").Value;
    string invoicenum = invoice.Element("Invoice_Number").Value;
}

しかし、どうすればErrorMessageを取得できますか?私は試した

string error = invoice.Element("Detail_Errors").Element("Detail_Error").Element("ErrorMessage").Value;

しかし、それは私に「オブジェクトのインスタンスに設定されていないオブジェクト参照」エラーを与えます。

他にどのようにこれを行うことができますか?ありがとうございました!!

4

1 に答える 1

1

指定したコードは、指定した XML に対して機能します。あなたは実際にエラーのない請求書を受け取っていると思いますが、それが間違っています。

エラーをループする必要があります。

foreach (var error in invoice.Elements("Detail_Errors").Elements("Detail_Error"))
{
    var id = error.Element("ErrorID").Value;
    var message = error.Element("ErrorMessage").Value;
    // Do whatever you want with the ID and message
}

ここでの使用に注意してElements("Detail_Errors")ください - 要素が常に1 つだけDetail_Errorsある場合 (子要素がない可能性があります)、使用することもできますElement("Detail_Errors")が、指定したコードは要素がなく Detail_Errorsても機能します。

于 2013-01-15T20:34:18.697 に答える