2013-01-15 2 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_Error가 없으면 Detail_Error 노드가 존재하지 않으므로 .Element ("Detail_Error")를 .Elements ("Detail_Error")로 변경해야했습니다. 적어도 그것이 내가 그것을 바꿔야한다고 생각한 이유입니다. 나는 여전히 Element vs Elements에 대해 배우고 있습니다. –

+1

@JeffBrady : 처음부터 'Elements'였습니다. –

관련 문제