Как получить коллекцию всех прямых дочерних узлов узла?

#c# #xml-parsing

Вопрос:

В C# вы можете запросить an XmlNode , чтобы найти его дочерние узлы, используя SelectNodes() вызов API и передачу an XPath .

Как XPath получить коллекцию прямых дочерних узлов?

напр.,

 lt;actionsgt;  lt;if operation="A"gt;   lt;if operation="B"gt;  lt;storegt;some valuelt;/storegt;  lt;if operation="C"gt; .... lt;/ifgt;  lt;/ifgt;  lt;/ifgt;  lt;storegt;valuelt;/storegt; lt;/actionsgt;  

В приведенном выше примере мне нужно получить прямой дочерний элемент lt;actionsgt; — узлов: lt;if operation="A"gt; и lt;storegt; . Из-за рекурсивной природы XML каждый if узел может содержать другой список if «s».

Я пытался actionNode.SelectNodes("child::*") , но это дает мне все дерево узлов ниже lt;actiongt; (при actionNode условии, что оно указывает на lt;actiongt; XML).

Комментарии:

1. Если вы хотите получить все дочерние элементы, просто используйте myXmlNode.ChildNodes коллекцию. SelectNodes() полезно, если вам нужны только некоторые дочерние или дочерние узлы. В этом случае вы объявляете выражение селектора через xpath.

Ответ №1:

Прямые дочерние элементы узла доступны через ChildNodes свойство узла. Смотрите, как его использовать ниже.

 [TestMethod] public void MyTestMethod3() {  var xml = new XmlDocument();  xml.LoadXml(  @"lt;actionsgt;  lt;if operation=""A""gt;   lt;if operation=""B""gt;  lt;storegt;some valuelt;/storegt;  lt;if operation=""C""gt; .... lt;/ifgt;  lt;/ifgt;  lt;/ifgt;  lt;storegt;valuelt;/storegt;  lt;/actionsgt;  ");   var actionsNode = xml.SelectSingleNode("/actions");   // all direct child nodes are available through node.ChildNodes property  var directChildren = actionsNode.ChildNodes;   // here is the proof:  CollectionAssert.AreEquivalent(  new string[] { "if", "store" },   directChildren.Castlt;XmlNodegt;().Select(i =gt; i.Name).ToArray()); }