我有以下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>
我可以访问&#34; Invoice_Number&#34;和&#34;状态&#34;具有以下代码的节点,但我不确定如何获取&#34; ErrorMessage&#34;节点。这就是我所拥有的:
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;
但是这给了我一个&#34;对象引用没有设置为对象的实例&#34;错误。
怎么办呢?谢谢!!
答案 0 :(得分: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")
- 如果总是只有一个Detail_Errors
元素(可能没有子元素),您可以使用Element("Detail_Errors")
但是即使有没有 Detail_Errors
元素,我给出的代码也会有效。