C# 使用C、XPath进行XML解析

C# 使用C、XPath进行XML解析,c#,xml,xpath,C#,Xml,Xpath,我的问题是关于XML解析实践的一般性问题 假设我们有一个XML文档,我们使用XPath从该文档中获取一些节点: XMLNode node1=XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode"); 现在n包含其他节点的数据。直观地说,我希望有以下代码行: XMLNode node2=XMLDoc.SelectSingleNode("/Child"); 用名为Child的节点1的子节点填充节点2。但可悲的是,它不是这样工作的。XPath搜索从文档的

我的问题是关于XML解析实践的一般性问题

假设我们有一个XML文档,我们使用XPath从该文档中获取一些节点:

XMLNode node1=XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode");
现在n包含其他节点的数据。直观地说,我希望有以下代码行:

XMLNode node2=XMLDoc.SelectSingleNode("/Child");
用名为Child的节点1的子节点填充节点2。但可悲的是,它不是这样工作的。XPath搜索从文档的根开始,而不是从调用它的XMLNode对象开始。有没有办法让它以直观的方式工作?这对于递归或面向对象的解析方法来说是很方便的

我尝试过使用XMLPathNavigator对象,但其工作方式相同。我似乎可以将XMLDocumentFragment的内部文本设置为给定节点的内部文本,但这似乎是一种低效的数据复制


有什么想法吗?

我认为应该是:

XMLNode node2=XMLDoc.SelectSingleNode(".//Child");

注意点。

使用//而不是/将匹配具有给定名称的所有节点

/从根节点中选择

//从当前节点中选择与所选内容匹配的文档中的节点,无论这些节点位于何处

XMLNode node2 = XMLDoc.SelectSingleNode("/Child");
这将从根/中选择名为“Child”的元素。请注意,您是在XMLDoc上应用调用,而不是在node1上应用调用,因此它将相对于文档的根。我想你想要的是:

XMLNode node2 = node1.SelectSingleNode("Child"); // edit: removed slash
它是相对于先前选择的节点的XPath,而不是文档根

或者,您可以执行以下操作:

XMLNode node = XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode/Child")

这将直接选择子节点。

哦,对不起,我在帖子中输入错误。node1.SelectSingleNode/Child;正如我所尝试的,它仍然会查看文档的根节点。第二个示例不起作用:node1.SelectSingleNode/Child;node1引用了文档根,当您用斜杠开始选择时,它会从文档根进行搜索。为了使它与NoDE1相对应,您需要删除斜杠。OOP,抱歉,斜杠是我的一个打字。如果您使用C 3或更高,考虑使用LINQ到XML。看见