使用XPath查询带有命名空间(有xmlns)的XML

标签: xmlsilverlightwebserviceencodingwpfinclude
2012-06-19 10:26 3235人阅读 评论(0) 收藏 举报

 分类:
XML(7) 

最近碰到一个小问题,通过调用webservice返回如下的xml,

<Seller xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <id xmlns="http://www.aaa.com/">348388</id>
  <gender xmlns="http://www.aaa.com/">Monsieur</gender>
  <lastName xmlns="http://www.aaa.com/">FABRIZZI</lastName>
  <firstName xmlns="http://www.aaa.com/">FRANCIS</firstName>
  <login xmlns="http://www.aaa.com/">francis.fabrizzi@bayern-aix.net.bmw.fr</login>
  <password xmlns="http://www.aaa.com/">KUVOTFP</password>
  <profile xmlns="http://www.aaa.com/">Chef de vente</profile>
  <email xmlns="http://www.aaa.com/">francis.fabrizzi@bayern-aix.net.bmw.fr</email>
  <mobilePhone xmlns="http://www.aaa.com/">0600000000</mobilePhone>
  <dateRec xmlns="http://www.aaa.com/">2012-02-21T22:49:49.283</dateRec>
  <dateMod xmlns="http://www.aaa.com/">2012-02-21T22:49:49.283</dateMod>
  <idDrv xmlns="http://www.aaa.com/">233734</idDrv>
  <drv xmlns="http://www.aaa.com/">DAVID ROUSSEAU</drv>
  <idCrv xmlns="http://www.aaa.com/">233775</idCrv>
  <crv xmlns="http://www.aaa.com/">ALEXANDRA CORDIER</crv>
  <idCdv xmlns="http://www.aaa.com/">0</idCdv>
  <dealerCode xmlns="http://www.aaa.com/">FB001</dealerCode>
  <dealerType xmlns="http://www.aaa.com/">Premium</dealerType>
  <dealerQualification xmlns="http://www.aaa.com/">GOLD</dealerQualification>
  <dealerName xmlns="http://www.aaa.com/">BAYERN AIX</dealerName>
  <dealerAddress xmlns="http://www.aaa.com/">ZA La Pioline</dealerAddress>
  <dealerZipCode xmlns="http://www.aaa.com/">13546</dealerZipCode>
  <dealerCity xmlns="http://www.aaa.com/">AIX EN PROVENCE</dealerCity>
  <dealerPhone1 xmlns="http://www.aaa.com/">0442162070</dealerPhone1>
  <dealerPhone2 xmlns="http://www.aaa.com/">0442162089</dealerPhone2>
  <dealerSellChannel xmlns="http://www.aaa.com/">CCP BMW Mini</dealerSellChannel>
</Seller>

当时也没有多想,直接用xpath解析了,没想到死活不成功,再仔细一看,原来有命名空间,真是头大。

然后去google找答案,如下部分转自帖子http://www.cnblogs.com/mgen/archive/2011/05/24/2056025.html。

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

比如下面这个XML

<a xmlns="mgen.cnblogs.com">

<b>ccc</b>

</a>

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

为什么会这样呢?MSDN的相应函数有解释(参考:http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectsinglenode.aspx)

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在后面程序中也会用到)

<?xml version="1.0" encoding="utf-8"?>

<root xmlns="dotnet" xmlns:w="wpf">

<a>data in a</a>

<w:b>data in b</w:b>

<c xmlns="silverlight">

<w:d>

<e>data in e</e>

</w:d>

</c>

</root>

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

<?xml version="1.0" encoding="utf-8"?>

<root xmlns="dotnet" xmlns:w="wpf">

<!-- xmlns: dotnet -->

<a>data in a</a>

<!-- xmlns: dotnet -->

<w:b>data in b</w:b>

<!-- xmlns: wpf -->

<c xmlns="silverlight">

<!-- xmlns: silverlight -->

<w:d>

<!-- xmlns: wpf -->

<e>data in e</e>

<!-- xmlns: silverlight -->

</w:d>

</c>

</root>

如果识别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 = new XmlDocument();

xmlDoc.Load(@"C:\a.txt");

//加入命名空间和前缀

var xmlnsm = new XmlNamespaceManager(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

转载于:https://www.cnblogs.com/bmaker/p/5605726.html

使用XPath查询带有命名空间(有xmlns)的XML(转)相关推荐

  1. 使用XPath查询带有命名空间(有xmlns)的XML

    最近碰到一个小问题,通过调用webservice返回如下的xml, <Seller xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan ...

  2. dom4j通过xpath查询xml

    获取Document  SAXReader saxReader = new SAXReader();  Document document = saxReader.read(FileUtil.getF ...

  3. 读写XML文档时,去掉新增加节点的“空命名空间”(xmlns=””)

    在做对ReprotViewer编程时,想做一个用户可以更改显示/打印列的功能,大致看了下,只需要通过对rdlc文件中改变其<Hidden>节点值为false/true,即可实现对应某列的显 ...

  4. java 解析xml xmlns_dom4j解析带有xmlns的xml文件

    dom4j解析带有xmlns的xml文件 上一篇 / 下一篇  2013-01-22 10:03:23 / 个人分类:Java学习 使用dom4j来解析带有命名空间的xml文件, 由于dom4j的xp ...

  5. 用linq查询html中div个数,C#使用Linq to XML进行XPath查询

    最近在用到HtmlAgliltyPack进行结点查询时,发现这里选择结点使用的是XPath.所以这里总结一下在C#中使用XPath查询XML的方式.习惯了用Linq,这里也是用的Linq to xml ...

  6. xpath下面的xpath_深入研究XPATH查询

    xpath下面的xpath 介绍 ( Introduction ) In my last article entitled "Which fields do my reports actua ...

  7. python xmlns 解析_Python 解析含有命名空间(xmlns)的xml文件(基于ElementTree)

    Python 解析含有命名空间(xmlns)的xml文件(基于ElementTree) Outline 为什么会有命名空间? XML的元素名字是不固定的,当两个不同的文档,使用同样的名称描述两个不同类 ...

  8. db2有MySQL那样的时间戳_MySQL 按照日期格式查询带有时间戳数据

    按照日期格式查询带有时间戳数据一般在MSQL数据库中的时间都是以时间戳的格式来存储时间的,但是对于我们来说,时间戳格式具体表示的是什么时间,我们很难一眼看出来,所以当我们要具体查询某一个时间或时间段的 ...

  9. Dom4j 解析Xml文档及 XPath查询 学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" ...

最新文章

  1. python经典好书-新手Python入门经典书籍推荐
  2. OpenCV霍夫线圆HoughLinesCircles的实例(附完整代码)
  3. 东北大学软件项目管理与过程改进_工程项目管理信息化实施方案
  4. 运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行脚本的问题
  5. 玩转 SpringBoot 2 之整合 JWT 下篇
  6. Vue中的scoped和scoped穿透
  7. 《算法问题实战策略》-chaper21-树的实现和遍历
  8. js 定时器_Node.js实战6:定时器,使用timer延迟执行
  9. IntelliJ idea 添加参数
  10. 动态规划——洛谷1020_导弹拦截(1999年的)
  11. 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 为什么有时候ASP在插入一条记录时,它会在数据里面插入两条一样的记录?...
  12. 幼儿园大班下学期幼小衔接工作计划
  13. 联发科mt6779(Helio P90),mt6775(Helio P70),MT6771(Helio P60),Helio P35,MT6762(Helio P22)处理器参数介绍
  14. Listener method could not be invoked with the incoming messageEndpoint handler details:Method
  15. 分析的意义:数据背后的故事(1)
  16. CPU怎么选择,单核cpu与多核cpu的区别
  17. 【Cheatsheet】Java的常用代码(以及eclipse技巧)
  18. 自己对PID控制算法的一点见解
  19. python开源库——h5py快速指南
  20. 黑马前端案例——模拟京东显示密码

热门文章

  1. windows批处理文件转义字符
  2. Python爬取代理IP
  3. 学生健康信息填报系统
  4. 【关于运维和网工的差别,一文说透】
  5. Android中Theme主题和Style样式使用介绍总结
  6. Android studio中TextView改变字体的两种方式(如仿宋、隶书)
  7. linux查看电源状态命令,linux查看机器运行状态常用命令
  8. 分布式任务调度平台XXL-JOB安装部署
  9. openwrt patch文件怎么用_Y.A.K.E
  10. 全国消费者只要动动鼠标就能买下一块土地当上“地主”