2011-02-06 6 views
1

다음 XML 문서가 있다고 가정 해 보겠습니다.LINQ로 XML 문서를 쿼리하는 방법?

<response> 
    <businessEntity> 
     <ABN> 
     <identifierValue></identifierValue> 
     <isCurrentIndicator></isCurrentIndicator> 
     <replacedIdentifierValue xsi:nil="true" /> 
     <replacedFrom></replacedFrom> 
     </ABN> 
     <entityStatus> 
     <entityStatusCode> </entityStatusCode> 
     <effectiveFrom></effectiveFrom> 
     <effectiveTo></effectiveTo> 
     </entityStatus> 
     <entityType> 
     <entityTypeCode> </entityTypeCode> 
     <entityDescription> </entityDescription> 
     </entityType> 
     <goodsAndServicesTax> 
      <effectiveFrom></effectiveFrom> 
      <effectiveTo></effectiveTo> 
     </goodsAndServicesTax> 
     <legalName> 
      <givenName> </givenName> 
      <otherGivenName /> 
      <familyName> </familyName> 
      <effectiveFrom></effectiveFrom> 
      <effectiveTo></effectiveTo> 
     </legalName> 
     <mainBusinessPhysicalAddress> 
      <stateCode> </stateCode> 
      <postcode></postcode> 
      <effectiveFrom></effectiveFrom> 
      <effectiveTo></effectiveTo> 
     </mainBusinessPhysicalAddress> 
    </businessEntity> 
</response> 

예를 들어 givenName과 familyName을 얻으려면 다음과 같이하면됩니다.

var businesses = doc.Descendants(ns + "businessEntity") 
      .Elements(ns + "legalName") 
      .Select(node => new 
      { 
       effectiveFrom = node.Element(ns + "effectiveFrom").Value, 
       givenName = node.Element(ns + "givenName").Value, 
       familyName = node.Element(ns + "familyName").Value, 
      }).ToList(); 

그러면 다음을 사용하여 테이블을 채울 수 있습니다. , 나는 전체 문서를 쿼리하는 방법을 잘 모르겠다. 예를 들어 ABN과 entityType과 같은 원하는 모든 노드를 얻는다. 내가 목록을 만들고 각 형제 코드의 일부를 legalName에 복제해야합니까?

미리 감사드립니다.

답변

1

각 하위 요소는이 방법을 시도 할 수 있습니다 만 일단 발생한다고 가정 할 경우

var businesses = (
    from node in doc.Descendants(ns + "businessEntity") 
    let legalName = node.Element(ns + "legalName") 
    let abn = node.Element(ns + "ABN") 
    // etc... 
    select new 
    { 
     LegalName = new 
     { 
      EffectiveFrom = (string)legalName.Element(ns + "effectiveFrom"), 
      GivenName = (string)legalName.Element(ns + "givenName"), 
      FamilyName = (string)legalName.Element(ns + "familyName"), 
     }, 
     Abn = new 
     { 
      IdentifierValue = (string)abn.Element(ns + "identifierValue"), 
      IsCurrentIndicator = (string)abn.Element(ns + "isCurrentIndicator"), 
      ReplacedFrom = (string)abn.Element(ns + "replacedFrom"), 
     }, 
     // etc... 
    }).ToList(); 


Console.WriteLine(businesses[0].LegalName.GivenName); 
Console.WriteLine(businesses[0].Abn.IsCurrentIndicator); 

당신은이 데이터를 외부에서 사용하려고하는 경우 대신 anonyous 유형의 구체적인 유형을 사용하는 것이 좋습니다 메서드를 사용하여 XML을 파싱합니다.

+0

감사합니다. 예상대로 작동하지만 값이 비어 있으면 오류가 발생합니다. 어떻게 처리해야합니까? – Nick

+0

@Nick : 어떤 부분이 "비어 있음"과 구체적으로 "비어 있음"(완전히 누락 되었습니까? 현재는 빈 문자열이 포함되어 있음)을 의미합니다. 'foo.Element (...). Value '를'(string) foo.Element (...)'로 변경해보십시오. 그래도 작동하지 않는다면 빈 내용과 비어있는 내용을 자세히 알려주십시오. 가장 간단한 방법은 실패한 XML 문서, 시도한 정확한 코드 및 오류 메시지를 게시하는 것입니다. 할 수 없다면 말로 설명 할 수 있습니다. –

+0

예를 들어 givenname에 값이 없으면 nullreferenceexception이 코드 – Nick

관련 문제