Используя Linq и XDocument, могу ли я получить все дочерние элементы под родительским тегом? - PullRequest
8 голосов
/ 25 апреля 2011

У меня есть XML

<data>
  <summary>
    <account curr_desc='USD' acct_nbr='123' net='1000.00' />
    <account curr_desc='USD' acct_nbr='456' net='2000.00' />
  </summary>
  <details>
    <accounts>
      <account acct_nbr="123" curr="USD">
        <activity color='False' settle_date='02 Jul 2010' amt='580.00' />
        <activity color='True' settle_date='09 Jul 2010' amt='420.00' />
      </account>
      <account acct_nbr="456" curr="USD">
        <activity color='True' settle_date='12 Dec 2010' amt='1500.00' />
        <activity color='True' settle_date='19 Dec 2010' amt='500.00' />
      </account>
    </accounts>
  </details>
</data>

Используя Linq и XDocument, я могу извлечь "сводную" информацию, но как я могу извлечь информацию "учетной записи" в теге "сводка"?

XDocument XMLDoc = XDocument.Load("testdata.xml");
XElement accounts = (from xml2 in XMLDoc.Descendants("summary")
                    select xml2).FirstOrDefault();

Как я могу указать что-то вроде "summary/account", чтобы он возвращал мне все элементы в <summary>? Обратите внимание, что у меня <account> под <detail><accounts>, я хочу только элементы под итоговым тегом.

Ответы [ 2 ]

19 голосов
/ 25 апреля 2011

Вы должны использовать метод Elements:

var accounts = doc.Root.Elements("summary").Elements("account");

Или, альтернативно, XPathSelectElements, что в данном случае проще:

var accounts = doc.XPathSelectElements("/data/summary/account");

В этом случае вы также можете использовать Descendants, как предложил Эндрю Барбер, но в целом вы должны делать это только тогда, когда вы действительно хотите найти всех потомков с заданным именем, а не только непосредственных детей. В противном случае ваш код выполняет большой поиск, в котором он не нуждается, и может возвращать элементы, которые вам не нужны.

3 голосов
/ 25 апреля 2011
var accountSummaryElems = 
   XMLDoc.Element("summary").Elements("account");

Это дает вам коллекцию элементов account в элементе summary. Затем вы можете повторить их, чтобы получить значения.

ИЗМЕНЕНО, чтобы использовать тот же шаблон, которым вы были; Я звоню First() вместо FirstOrDefault(), потому что этот код не будет работать в любом случае, если элемент "account" не найден.

Тогда у вас есть правильная идея с итерацией по возвращенной коллекции.

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