600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 详解XML命名空间(XML Namespaces)介绍以及节点读取方法的示例代码

详解XML命名空间(XML Namespaces)介绍以及节点读取方法的示例代码

时间:2020-02-12 09:40:24

相关推荐

详解XML命名空间(XML Namespaces)介绍以及节点读取方法的示例代码

XML/RSS教程

XML,命名空间,节点读取

XML/RSS教程

XML 命名空间提供避免元素命名冲突的方法。

电影选座安卓源码,ubuntu查看tcp参数,安装好tomcat服务器,宝塔面板限制爬虫,中山哪里有学习php的教程,学院SEO方案lzw

命名冲突

政府办公 oa 源码,ubuntu创建虚拟节点,唐山爬虫ip厂,php data 卡号,崇左seo推广lzw

在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。

自动赚钱系统 源码,ubuntu 传送门,tomcat端口负载平衡,vc 爬虫 框架,php个人空间,无加盟费的seo优化系统加盟lzw

这个 XML 文档携带着某个表格中的信息:

ApplesBananas

这个 XML 文档携带有关桌子的信息(一件家具):

African Coffee Table 80 120

假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的

此 XML 文档携带着有关一件家具的信息:

(转原文/mgen/archive//05/24/2056025.html)

众所周知,XmlDocument可以进行XPath查询,但实际上这里所说的XPath查询仅限于没有命名空间(没有xmlns属性)的XML,一旦遇到有命名空间的XML,对应XPath查询都会无结果。

比如下面这个XML

ccc

XPath查询/a/b会返回null,而如果没有xmlns的话,会返回节点b。

If the XPath expression does not include a prefix, it is assumed that the namespace URI is the empty namespace. If your XML includes a default namespace, you must still add a prefix and namespace URI to the XmlNamespaceManager; otherwise, you will not get any nodes selected

意思就是如果XPath表达式没有加前缀(如a:b中前缀是a),那么所查询节点(注意属性也可以是节点)的命名空间URI就应该是空值(也是默认值),否则XPath不会返回结果。

上面的XML, 因为节点a和b都有命名空间值,自然XPath查询不会有结果。

(上面英文还提到如果节点有默认命名空间,那么还得手动向XmlNamespaceManager添加前缀和命名空间值,这个在后面会讲的)

在看解决方案前,首先需要能够辨识XML命名空间,当然辨识XML命名空间值还是很容易的,参考如下XML(这个XML在后面程序中也会用到)

data in a data in b data in e

它的所有XML节点的命名空间如下所示:

data in a data in b data in e

如果识别XML命名空间没有问题,那么后面的操作就相当简单了,你需要记住:在XmlDocument中用XPath查询某一节点时,只要它的命名空间值不是空值,那么你必须给它一个前缀, 用这个前缀代表这个节点的命名空间值!这些前缀是通过XmlNamespaceManager类添加的,使用时将XmlNamespaceManager 传入SelectNodes或SelectSingleNode中即可。这也是为什么上面说“如果节点有默认命名空间,那么还得手动向 XmlNamespaceManager添加前缀和命名空间值”的原因。

另外构造一个XmlNamespaceManager需要XmlNameTable对象,这个对象可以从XmlDocument.NameTable和XmlReader.NameTable属性中得到。

下面我们步入代码,比如说查询上面XML中的节点e,分析位置节点e位于:root->c->d->e,然后将所需命名空间值加入到 XmlNamespaceManager中(前缀名称无所谓,只要在XPath一致即可),查询即可成功,如下代码:

/* * 假设上面XML文件在C:\a.txt中 * 下面代码会查询目标节点e,并输出数据:data in e * */ var xmlDoc =newXmlDocument(); xmlDoc.Load(@"C:\a.txt"); //加入命名空间和前缀 var xmlnsm =newXmlNamespaceManager(xmlDoc.NameTable); xmlnsm.AddNamespace("d", "dotnet"); xmlnsm.AddNamespace("s", "silverlight"); xmlnsm.AddNamespace("w", "wpf"); var node = xmlDoc.SelectSingleNode("/d:root/s:c/w:d/s:e", xmlnsm); Console.WriteLine(node.InnerText); //输出:data in e

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。