用C#解析XML,XPath

问题描述:

Mine是一个关于XML解析实践的常见问题。用C#解析XML,XPath

假设我们有一个XML文件,我们使用XPath从那个文件的某个节点:

XMLNode node1=XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode"); 

现在N包含SomeOtherNode的数据。直觉上,我期望下面的代码行:

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

填充节点2与节点1的那些孩子们被命名为“孩子”。但遗憾的是,这种方式并不奏效。 XPath搜索从文档的根目录开始,而不是从它被调用的XMLNode对象开始。有没有什么办法让它以“直观”的方式工作?这对于递归或面向对象的解析方法来说是很方便的。

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

任何想法?

+0

如果您使用C#3或更高版本,请考虑使用LINQ to XML。请参阅http://msdn.microsoft.com/en-us/library/bb387098.aspx – TrueWill 2009-11-26 03:07:03

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

这将选择称为“少年”的元件从根(/)开始。请注意,您在node1上应用XMLDoc上的呼叫而不是,因此它将相对于文档的根。我想你想要的是:

XMLNode node2 = node1.SelectSingleNode("Child"); // edit: removed slash 

这是相对于先前选择的节点的XPath,而不是文档根目录。

或者,你可以这样做:

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

这将直接选择子节点。

+0

对不起,我在输入中输入错误。 node1.SelectSingleNode( “/儿童”);是我试过的,它仍然看着文档的根节点。 – Vercinegetorix 2009-11-26 02:42:03

+0

你的第二个例子不起作用:node1.SelectSingleNode(“/ Child”); node1具有对文档根目录的引用,并且当您使用开始斜杠进行选择时,它将从文档根目录进行搜索。 要使其相对于节点1,您需要删除斜线。 – dan 2009-11-26 03:13:09

+0

哎呀,对不起,斜线是我的一个错字。 – 2009-11-26 10:05:37

我相信它应该是:

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

(注点)。

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

/选择从根节点

//选择从符合选择当前节点的文档中的节点不管它们是