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

原文:操作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; }

时间: 2024-10-17 11:53:28

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

文档对象模型操作xml文档

简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规范化接口.DOM是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口,它以树状结构表示HTML和XML文档,定义了遍历这个树和检查.修改树的节点的方法和属性. DOM的核心API还允许你创建和填充文件.加载文档并保存. 2.2DOM实现 微软的net框架在Systemx.x

C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)

XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀.XML文档主要由元素节点和节点的属性共同构成的.它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子子节点:每一个节点有开始就一定会有结束,不可能出现有开始无结束的节点,节点主要有两种类型:有InnerText的<city>……</city>和没有InnerText的<city……/>.在节点中含有属性,一个节点可以含有多个属性,每个属性是由名字和值共同构成的. 在XML

java操作xml文档

目前最常用的XML解析技术是DOM和SAX. DOM是基于XML的树结构来完成解析的,适用于多次访问的XML文档,但是DOM解析比较消耗资源:而SAX是基于事件解析,适用于大数据量的XML文档,占用资源少,内存消耗小. DOM是文档对象模型(Document Object Model) 首先DOM会将XML文档映射成一颗倒挂的树,在这棵树中,每个节点都是以节点对象的形式存在的. 我们通过操作这些对象就可以完成XML文件的读写任务了. 我们可以直接根据节点的名称或属性查找该节点对象,也可以根据一个

C#操作xml文档增删改查(Linq to XML)

1.创建xml 1 public static void CreateXmlDoc() 2 { 3 XElement myDoc = 4 new XElement("Customers", 5 new XElement("Customer", new XAttribute("ID", "1"), 6 new XElement("Usename", "Rock Zed"), 7 new X

Word 2010打开大文档时速度很慢的解决方法

这两天终于搞清楚了一个困扰了我很久的问题.我的Word 2010在打开很大的Word文档(如小组的硕士学位论文)时,经常发生速度慢甚至很长时间没有响应的问题.在师弟的提示下,终于找到一个折衷的解决方案: 其实是对中英文混合大文档拼写检查的问题,关闭拼写和语法检查就可以了,设置方法:点击"文件"--"选项"--"校对"--取消"在Word中更新拼写和语法时"下的所有对号.就可以顺利打开Word文档了. 另外,我们在英文的时候需要

用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……

大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果抽象成一个树形结构的类,查找节点是不是就可以用lambda了,创建修改都是操作类,那不是好用得飞起!说干就干,经过两天打磨,终于是大功告成.系统默认的XML文件相关操作我就不吐槽了,来看看怎么飞起的吧. 设计思路: 写着好多啊,简单来说就是把XML标签分为两类:XmlChildTag子标签和XmlB

XML文档中的xmlns、xmlns:xsi和xsi:schemaLocation

文章转载自:https://yq.aliyun.com/articles/40353 相信很多人和我一样,在编写Spring或者Maven或者其他需要用到XML文档的程序时,通常都是将这些XML文档头拷贝过来,并没有理解其中元素(比如xmlns,xmlns:xsi,xsi:schemaLocation)的真正含义,不知道哪些元素是多余的,也不知道为什么要加那些元素.这样当有时候网上Copy的XML头有错的时候自己却不知道怎么下手.我也是这样的,于是今天花了点时间好好的理解了一下这些元素及其用法,

C# 操作XML文档 使用XmlDocument类方法

W3C制定了XML DOM标准.很多编程语言中多提供了支持W3C XML DOM标准的API.我在之前的文章中介绍过如何使用Javascript对XML文档进行加载与查询.在本文中,我来介绍一下.Net中的XmlDocument类.它支持并扩展了W3C XML DOM标准.它将整个XML文档都先装载进内存中,然后再对XML文档进行操作,所以如果XML文档内容过大,不建议使用XmlDocument类,因为会消耗过多内存.对于很大的XML文档,可以使用XmlReader类来读取.因为XmlReade

C#操作XML文档总结

包括XMLWriter写入,XmlReader读取,XmlDocument操作,DataSet.ReadXML(),DataSet.WriteXML(),LINQ查询XML 1.XMLWriter写入XML数据 结果会覆盖原文档. c#_code: //使用XMLWriter写XML数据 XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; //缩进 //settings.NewLineOnAt