Использование LINQ to XML для сопоставления более глубоких потомков? - PullRequest
0 голосов
/ 14 апреля 2011

Предположим, у меня есть следующий XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <project>
    <ixGroup>105</ixGroup>
    <sGroup>Place Group</sGroup>
  </project>
  <project>
    ...

И я использую следующий код для извлечения из него различных текстовых значений <ixGroup> и <sGroup>:

XDocument doc = XDocument.Load(@"C:\temp\xmlParse2.xml");

var projects = (from project in doc.Descendants("project")
                select new {
                    id = project.Element("ixGroup").Value,
                    name = project.Element("sGroup").Value
                }).Distinct();

foreach(var project in projects)
{
    project.id.Dump("id");
    project.name.Dump("name");
}

Если в том же XML-файле есть дополнительный элемент, такой как <projects>, добавленный ниже:

<response>
  <projects>
    <project>
      <ixGroup>105</ixGroup>
      <sGroup>Place Group</sGroup>
    </project>
    <project>
      ...

Как бы я изменил приведенный выше код LINQ для получения доступа к элементам <project>?

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Тебе бы не пришлось.Я только что проверил это, и ваш текущий оператор LINQ по-прежнему будет возвращать все элементы <project> независимо от того, вложены ли они в элемент <projects>.

2 голосов
/ 14 апреля 2011

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

(метод, который ищет только прямые дочерние методы, Children().

0 голосов
/ 14 апреля 2011

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

...