#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()); }