定名争执
在 XML 中,元素称号是由开发者定义的,当两个差别的文档运用雷同的元素名时,就会发作定名争执。
这个 XML 文档照顾着某个表格中的信息:
<tr> <td>Apples</td> <td>Bananas</td> </tr>
这个 XML 文档照顾有关桌子的信息(一件家具):
<name>African Coffee Table</name> <width>80</width> <length>120</length>
假如这两个 XML 文档被一同运用,由于两个文档都包括带有差别内容和定义的 <table> 元素,就会发作定名争执。
XML 解析器没法肯定怎样处置惩罚这类争执。
运用前缀来防止定名争执
此文档带有某个表格中的信息:
<h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr>
此 XML 文档照顾着有关一件家具的信息:
<f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length>
如今,定名争执不存在了,这是由于两个文档都运用了差别的称号来定名它们的 <table> 元素 (<h:table> 和 <f:table>)。
经由过程运用前缀,我们创建了两种差别范例的 <table> 元素。
运用定名空间(Namespaces)
这个 XML 文档照顾着某个表格中的信息:
<h:table > <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
此 XML 文档照顾着有关一件家具的信息:
<f:table > <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
与仅仅运用前缀差别,我们为 <table> 标签增加了一个 xmlns 属性,如许就为前缀给予了一个与某个定名空间相干联的限制称号。
XML Namespace (xmlns) 属性
XML 定名空间属性被放置于元素的最先标签当中,并运用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当定名空间被定义在元素的最先标签中时,一切带有雷同前缀的子元素都邑与同一个定名空间相干联。
解释:用于标示定名空间的地点不会被解析器用于查找信息。其唯一的作用是给予定名空间一个唯一的称号。不过,许多公司常常会作为指针来运用定名空间指向现实存在的网页,这个网页包括关于定名空间的信息。
一致资本标识符(Uniform Resource Identifier (URI))
一致资本标识符是一串可以标识因特网资本的字符。最经常使用的 URI 是用来标示因特网域名地点的一致资本定位器(URL)。另一个不那末经常使用的 URI 是一致资本定名(URN)。在我们的例子中,我们仅运用 URL。
默许的定名空间(Default Namespaces)
为元素定义默许的定名空间可以让我们省去在一切的子元素中运用前缀的事情。
请运用下面的语法:
xmlns="namespaceURI"
这个 XML 文档照顾着某个表格中的信息:
<table > <tr> <td>Apples</td> <td>Bananas</td> </tr> </table>
此 XML 文档照顾着有关一件家具的信息:
<table > <name>African Coffee Table</name> <width>80</width> <length>120</length> </table> (转原文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。
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在背面顺序中也会用到)
<?xmlversion="1.0" encoding="utf-8"?> <rootxmlns="dotnet" xmlns:w="wpf"> <a>data in a</a> <w:b>data in b</w:b> <cxmlns="silverlight"> <w:d> <e>data in e</e> </w:d> </c> </root>
它的一切XML节点的定名空间以下所示:
<?xmlversion="1.0" encoding="utf-8"?> <rootxmlns="dotnet" xmlns:w="wpf"> <!-- xmlns: dotnet --> <a>data in a</a> <!-- xmlns: dotnet --> <w:b>data in b</w:b> <!-- xmlns: wpf --> <cxmlns="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 =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
以上就是详解XML定名空间(XML Namespaces)引见以及节点读取要领的示例代码的细致内容,更多请关注ki4网别的相干文章!