所以我试图使用System.XML用C#解析以下XML文档:
<root xmlns:n="http://www.w3.org/TR/html4/">
<n:node>
<n:node>
data
</n:node>
</n:node>
<n:node>
<n:node>
data
</n:node>
</n:node>
</root>
Run Code Online (Sandbox Code Playgroud)
每个带有命名空间的XPath论文都告诉我要做以下事情:
XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
mgr.AddNamespace("n", "http://www.w3.org/1999/XSL/Transform");
Run Code Online (Sandbox Code Playgroud)
在我添加上面的代码后,查询
xmlDoc.SelectNodes("/root/n:node", mgr);
Run Code Online (Sandbox Code Playgroud)
运行良好,但什么都不返回.下列:
xmlDoc.SelectNodes("/root/node", mgr);
Run Code Online (Sandbox Code Playgroud)
如果我修改XML文件并删除名称空间,则返回两个节点,因此似乎其他所有内容都已正确设置.任何想法为什么它不起作用的命名空间?
非常感谢!
我的是关于XML解析实践的一般问题.
假设我们有一个XML文档,我们使用XPath从该文档中获取一些节点:
XMLNode node1=XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode");
Run Code Online (Sandbox Code Playgroud)
现在n包含SomeOtherNode的数据.直观地说,我希望以下代码行:
XMLNode node2=XMLDoc.SelectSingleNode("/Child");
Run Code Online (Sandbox Code Playgroud)
使用名为"Child"的node1的子节点填充node2.但遗憾的是,它并没有这样的方式.XPath搜索从文档的根开始,而不是从调用它的XMLNode对象开始.有没有办法让它以"直观"的方式工作?这对于递归或面向对象的解析方法来说是方便的.
我尝试过使用XMLPathNavigator对象,但它的工作方式相同.似乎我可以将XMLDocumentFragment的内部文本设置为给定节点的内部文本,但这似乎是一种低效的数据重复.
有任何想法吗?