LINQ к XML: как я получаю только прямых потомков XElement?

Обратите внимание, что все из эти stringstream методы могут включать блокировку вокруг использования объекта языкового стандарта для форматирования. Это может быть чем-то, чтобы опасаться при использовании этого преобразования из нескольких потоков...

Посмотрите здесь для больше. Преобразовывают число в строку с указанной длиной в C++

17
задан Micha Wiedenmann 26 February 2018 в 10:23
поделиться

4 ответа

Сводка Exec - вы хотите:

xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))

Первый ответ:

XElement.Descendants , или это вопрос с подвохом? : P Здесь есть пример использования Descendants

Исправленный ответ, спасибо Tormod - что-то не так!:

Elements дает прямых потомков, как вы и ищете. Потомки дают полную иерархию [как вы утверждаете, что это делает Elements]. (Пример, на который я ссылался, проясняет это. Приношу извинения за путаницу!

Итак, наконец, то, что вы ищете (на этот раз в VB):

Dim xml = <Root>
        <Parent id="1">
          <Child>Thomas</Child>
        </Parent>
        <Parent id="2">
          <Child>Tim</Child>
          <Child>Jamie</Child>
        </Parent>
      </Root>

REM All nodes two levels down in the hierarchy
Dim level2Nodes = xml.Elements.SelectMany(function(element) element.Elements)
level2Nodes.Dump

REM All Child nodes, no matter where they are:
Dim children = xml.Descendants("Child")

Каждый из них даст вам 3 "" ` элементов по разным причинам, как описано в REM.

(Вставьте приведенное выше непосредственно в LINQPad в режиме оператора VB)

Теперь я понимаю, что вас может сбить с толку - когда вы используете Elements и смотрите на это в визуализаторе, вы все еще видите детей: -

Dim parents = xml.Elements

Если вам нужны только настоящие имена, вы можете использовать что-то вроде:

Dim parentNames = xml.Elements.Select(function(element) element.Name)

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

Если вы действительно хотите избавиться от детей, вы хотите:

Dim parentElements = xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))

Можете ли вы расширить свой вопрос, чтобы показать, что вы действительно ищете?

18
ответ дан 30 November 2019 в 11:44
поделиться

XElement.Elements получает коллекцию дочерних элементов. Например ...

var s = @"<root>
             <e1>
                 <e2>
                 </e2>
             </e1>
             <e1>
                 <e2>
                 </e2>
             </e1>
             <e1>
                 <e2>
                 </e2>
             </e1>
          </root>";

var doc = XElement.Load( new StringReader(s) );

Console.WriteLine( doc.Elements().Count() ); // 3
Console.WriteLine( doc.Descendants().Count()); //6
17
ответ дан 30 November 2019 в 11:44
поделиться

Почему бы не использовать XPath?

Dim myXML As var = New XmlDocument()
myXML.Load(myXML.xml)

For Each node As XmlNode In myXML.SelectNodes("//")
    Dim myVar As var = node.SelectSingleNode("Parent").InnerText
Next

Возьмите это с долей скептицизма - я только что преобразовал его из C # в VB.

-1
ответ дан 30 November 2019 в 11:44
поделиться

Если все прямые потомки имеют одно и то же известное имя элемента, и это имя элемента не может появиться на другом уровне, вы можете использовать xml.Descendants ("Parent").

0
ответ дан 30 November 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: