vb.net xml childnodes, похоже, не подбирает атрибуты - PullRequest
0 голосов
/ 24 августа 2011

У меня сложилось впечатление, что узел может быть чем угодно, будь то элемент, атрибут и т. Д. И т. Д.

Я пытался перебрать список узлов, например ....

Dim xmlDoc As New Xml.XmlDocument
xmlDoc.LoadXml("   
    < main1 test1 = 'any' test2 = 'any2' >
    < test1 > ttr < /test1 >
    < test1 > ttr < /test1 >
    < test1 > ttr < /test1 >
    < test1 > ttr < /test1 >
    < /main1 >")

Вопрос 1

Почему следующее возвращает только элементы, а не атрибуты:

For Each objnode As Xml.XmlNode In xmlDoc.DocumentElement.ChildNodes
    Console.WriteLine(objnode.Name)
Next

Вопрос 2

Как я могу перебрать все узлы, независимо от типа, используя xpath?

1 Ответ

3 голосов
/ 24 августа 2011

Хорошо в модели DOM, в которой System.Xml.XmlDocument / XmlElement / XmlNode реализует коллекцию ChildNodes, вы получаете все узлы, которые считаются дочерними узлами контейнерного узла, которые могут быть узлами элементов, текстовыми узлами, узлами комментариев, узлами инструкций обработки (и для XmlDocument узел DOCTYPE и объявление XML).Узлы атрибутов не считаются дочерними узлами в этой модели, поэтому вы не найдете их в коллекции ChildNodes.Вы можете получить доступ к коллекции атрибутов , если вам это интересно.

[править] Вы можете использовать оператор объединения XPath |, чтобы выбирать и обрабатывать объединение узлов так, чтобы XML был

<!-- comment 1 -->
<root att1="value 2" att2="value 2">Text<!-- comment 2 --><child att3="value 3">
  <descendant/>
</child>
</root>

следующий фрагмент VB

Dim doc As New XmlDocument()
doc.Load("file.xml")

For Each node As XmlNode In doc.SelectNodes("//node() | //@*")
    Console.WriteLine("Found node of type {0} with name {1}", node.NodeType, node.Name)
Next

выводит

Found node of type Comment with name #comment
Found node of type Element with name root
Found node of type Attribute with name att1
Found node of type Attribute with name att2
Found node of type Text with name #text
Found node of type Comment with name #comment
Found node of type Element with name child
Found node of type Attribute with name att3
Found node of type Element with name descendant

Таким образом, вы получаете одно выражение пути, выбирающее как атрибуты, так и узлы элементов,текстовые узлы и узлы комментариев.

Вы также должны знать, что DOM и XSLT / XPath имеют некоторое несоответствие в своих моделях дерева, например, DOM различает обычные текстовые узлы и узлы секций CDATA, XPath не делает этого.И DOM допускает смежные текстовые узлы, XPath не делает этого.Поэтому, несмотря на то, что вы часто можете писать запросы XPath к деревьям DOM, а Microsoft поддерживает это как с реализацией DOM MSXML, так и с реализацией DOM .NET, вам необходимо помнить о тонких различиях между моделями деревьев, с которыми определяется XPath, и использовать XPath при выполнении SelectSingleNode илиВыберите узлы в System.Xml.XmlDocument / XmlElement / XmlNode.

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