用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的内部文本设置为给定节点的内部文本,但这似乎是数据的低效重复。
任何想法?
XMLNode node2 = XMLDoc.SelectSingleNode("/Child");
这将选择称为“少年”的元件从根(/)开始。请注意,您在node1上应用XMLDoc上的呼叫而不是,因此它将相对于文档的根。我想你想要的是:
XMLNode node2 = node1.SelectSingleNode("Child"); // edit: removed slash
这是相对于先前选择的节点的XPath,而不是文档根目录。
或者,你可以这样做:
XMLNode node = XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode/Child")
这将直接选择子节点。
对不起,我在输入中输入错误。 node1.SelectSingleNode( “/儿童”);是我试过的,它仍然看着文档的根节点。 – Vercinegetorix 2009-11-26 02:42:03
你的第二个例子不起作用:node1.SelectSingleNode(“/ Child”); node1具有对文档根目录的引用,并且当您使用开始斜杠进行选择时,它将从文档根目录进行搜索。 要使其相对于节点1,您需要删除斜线。 – dan 2009-11-26 03:13:09
哎呀,对不起,斜线是我的一个错字。 – 2009-11-26 10:05:37
我相信它应该是:
XMLNode node2=XMLDoc.SelectSingleNode(".//Child");
(注点)。
使用//而不是/将匹配给定名称的所有节点。
/选择从根节点
//选择从符合选择当前节点的文档中的节点不管它们是
如果您使用C#3或更高版本,请考虑使用LINQ to XML。请参阅http://msdn.microsoft.com/en-us/library/bb387098.aspx – TrueWill 2009-11-26 03:07:03