原文:操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)

不管是用 PHP 还是 C#, 在操作 XML 的时候我们除了一个节点一个节点去取值之外, 还有一个非常方便的表达式, 就是 XPATH   
而昨晚在使用 XPATH 的时候, 遇到一个问题, 改了一个晚上才搞定, 差点没吐血. 果然基础知识要掌握扎实啊!!

假设有以下一份 XML 文档:

 

我们要获取所有歌曲的标题, 一般是使用以下的 XPATH 表达式:

代码如下:
/playlist/trackList/track/title

但是匹配的结果会让你非常失望, 你会发现什么也得不到. 于是我在这个问题上卡了好几个小时, 最终万能的 Google 告诉了我答案.
在第二行 playlist 那个节点, 有一个 XMLNS 属性, 这个是 XML 的命名空间 (Namespace), 就是因为这个属性的存在, 所以我们上面的 XPATH 就无效了. 怎么办? 答案是在程序中为我们的 XML 注册命名空间.
使用 C# 给 XML 注册命名空间和获取歌曲标题:

代码如下:
XmlDocument xml = new XmlDocument();
xml.Load("music.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(xml.NameTable);
xnm.AddNamespace("x", "http://xspf.org/ns/0/");
string xpath = "/x:playlist/x:trackList/x:track/x:title";
foreach (XmlNode xn in xml.SelectNodes(xpath, xnm))
{ Console.WriteLine(xn.InnerText); }

代码如下:

$xml = simplexml_load_file('music.xml'); $xml->registerXPathNamespace('x','http://xspf.org/ns/0/'); $xpath = '/x:playlist/x:trackList/x:track'; $result = $xml->xpath($xpath); foreach($result as $row){ echo $row->title; }

最新文章

  1. javascript表单的Ajax 提交插件的使用
  2. bzoj2342还是马拉车
  3. 【bzoj2281】 Sdoi2011—黑白棋
  4. jdk RSA算法类使用
  5. 【转】Android 平台下使用 i2c-tools
  6. mac/linux install hg
  7. 3.linux常用软件的安装方法
  8. js 判断网页类型
  9. ThinkPHP3.2.3版本框架could not find driver错误
  10. 关于MATLAB处理大数据坐标文件2017527
  11. CSS容器属性
  12. 分布式唯一ID生成方案是什么样的?(转)
  13. ABP给WebApi添加性能分析组件Miniprofiler
  14. centos7安装svn
  15. Django06-ORM操作
  16. linux的tar命令
  17. mysql常用sql汇总
  18. 051 日志案例分析(PV,UV),以及动态分区
  19. 基于HTML5全屏图文左右滑动切换特效
  20. HDU-6033 Add More Zero

热门文章

  1. UItableview正在滚动的时候进行操作容易出问题
  2. 通过binlog日志统计dml语句,找出操作频繁的表
  3. Methods and systems to control virtual machines
  4. matlab 图像分块及恢复
  5. vuex与vue-router学习方案
  6. vue 遇到的问题
  7. unity3D 4.6与上述号码. UI穿透问题,而且不穿透的真机模拟器渗透问题解决
  8. vmware合并多个虚拟硬盘文件(使用vmware-vdiskmanager.exe)
  9. Android官方教程翻译(3)——创建一个简单的用户界面
  10. Linux Sed技巧