Как запросить документ XML с помощью LINQ? - PullRequest
1 голос
/ 06 февраля 2011

Допустим, у меня есть следующий 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>

Если я хочу получить, например, заданные NameName и 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 Ответ

1 голос
/ 06 февраля 2011

Если вы можете предположить, что каждый подэлемент встречается только один раз, вы можете попробовать этот подход:

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);

Вы также можете рассмотреть возможность использования конкретных типов вместо анонимных типов, если эти данные будут использоваться снаружиметод, в котором вы анализируете XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...