2013-01-15 37 views
0

我有以下XML文件:如何訪問更深的xdocument節點?

<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」和「狀態」節點用下面的代碼,但我不知道怎麼還搶「的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; 

但是,這給了我一個「對象引用未設置爲對象的實例」錯誤。

這又怎麼辦?謝謝!!

+2

您的示例XML無效 - 它會啓動一個''元素,但結束爲''。請給我們一個簡短但完整且有效的XML和代碼示例。 –

+0

對不起,這是一個錯字..我已經更新它。第一個應該是。 –

+0

您的代碼對於提供的XML正常工作。 –

回答

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元素,我已經給出了工作。

+0

工作!謝謝!!!!而且你沒有錯誤就碰到一張發票​​是正確的。這就是我被卡住的原因。另外,在上面的代碼中,如果沒有Detail_Errors,則必須將.Element(「Detail_Error」)更改爲.Elements(「Detail_Error」),因爲Detail_Error節點不存在。至少這就是爲什麼我認爲我必須改變它..我仍然在學習元素與元素。 –

+1

@JeffBrady:哎呀,從一開始就應該是'Elements' ... –