Как получить значение определенного вложенного XML-элемента, используя LINQ to XML - PullRequest
0 голосов
/ 29 октября 2011

У меня есть такой XML

    <Root>
      <NodeA>
        <NodeA1>
          <NodeA11>
            <SameNameNode>
              <SameNameNodeChild1>Value 1</SameNameNodeChild1>
              <SameNameNodeChild2>Value 2</SameNameNodeChild2>
            </SameNameNode>
          </NodeA11>
        </NodeA1>
      </NodeA>
      <NodeB>
        <SameNameNode>
          <SameNameNodeChild1>Value 3</SameNameNodeChild1>
          <SameNameNodeChild2>Value 4</SameNameNodeChild2>
        </SameNameNode>
      </NodeB>
      <NodeC>
        <NodeC1>
          <SameNameNode>
            <SameNameNodeChild1>Value 5</SameNameNodeChild1>
            <SameNameNodeChild2>Value 6</SameNameNodeChild2>
          </SameNameNode>
        </NodeC1>
      </NodeC>
   </Root>

Как видите, «SameNameNode» и его дочерние элементы появляются в нескольких местах на разных уровнях вложенности, но имена совпадают. Как получить значения элементов «Значение 1» и «Значение 2» только с помощью LINQ to XML. Спасибо.

1 Ответ

1 голос
/ 30 октября 2011

Вот пример кода, который будет захватывать значения:

public static void Main()
{
    var xdoc = XDocument.Parse(@"
<Root>
<NodeA>
<NodeA1>
    <NodeA11>
    <SameNameNode>
        <SameNameNodeChild1>Value 1</SameNameNodeChild1>
        <SameNameNodeChild2>Value 2</SameNameNodeChild2>
    </SameNameNode>
    </NodeA11>
</NodeA1>
</NodeA>
<NodeB>
<SameNameNode>
    <SameNameNodeChild1>Value 3</SameNameNodeChild1>
    <SameNameNodeChild2>Value 4</SameNameNodeChild2>
</SameNameNode>
</NodeB>
<NodeC>
<NodeC1>
    <SameNameNode>
    <SameNameNodeChild1>Value 5</SameNameNodeChild1>
    <SameNameNodeChild2>Value 6</SameNameNodeChild2>
    </SameNameNode>
</NodeC1>
</NodeC>
</Root>");

    var results = xdoc.Root
        .Elements("NodeA")
        .Elements("NodeA1")
        .Elements("NodeA11")
        .Elements("SameNameNode")
        .Descendants()
        .Select(e => new { ElementName = e.Name, ElementValue = e.Value });

    foreach (var result in results)
            Console.WriteLine("Name = {0}, Value = {1}", result.ElementName, result.ElementValue);
    }

Будет выведено:

Name = SameNameNodeChild1, Value = Value 1
Name = SameNameNodeChild2, Value = Value 2

Возможно, вам придется настроить запрос - я предполагаю, что вы хотите, чтобы все потомки "SameNameNode", но вы можете фильтровать только определенные подэлементы.

@ Mun, чтобы ответить на ваш вопрос о синтаксисе запроса LINQ, вы можете сделать то же самое с этим кодом. 2 части кода эквивалентны:

var results = from nodeAElem in xdoc.Root.Elements("NodeA")
               from nodeA1Elem in nodeAElem.Elements("NodeA1")
               from nodeA11Elem in nodeA1Elem.Elements("NodeA11")
               from sameNameNodeElem in nodeA11Elem.Elements("SameNameNode").Descendants()
               select new { ElementName = sameNameNodeElem.Name, ElementValue = sameNameNodeElem.Value };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...