程序写得不少,或多或少都操作过XML,但对XML的一些概念不是完全了解,最近来学习一些XML的基础知识。
XML Namespaces 命名空间
不仔细去看或用到XML的命名空间,我们还是很少去了解他的,也不知道这到底有什么用。
XML 命名空间就像.net程序的命名空间一下,可提供避免元素命名冲突的方法。
何来命名冲突?由于 XML 中的元素名是预定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。
这个 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>
假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突,因为他的语义是不同的,也就是不同的东西,而我们都想把他命名为table。使用前缀来避免命名冲突
此文档带有某个表格中的信息:
<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> 元素 (<h:table> 和 <f:table>)。通过使用前缀,我们创建了两种不同类型的 <table> 元素。
当我们使用 XSL 时,就会看到实际使用中的命名空间。XSL 样式表用于将XML文档转换为其他格式,比如 HTML。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
</xsl:template>
.net 下的XML操作的命名空间,XmlNamespaceManager 解析集合的命名空间、向集合添加命名空间和从集合中移除命名空间,以及提供对这些命名空间的范围管理,XPath 表达式中的任何前缀都使用提供的 System.Xml.XmlNamespaceManager 进行解析,如下是XPath的简单示例。
Console.WriteLine(x.DocumentElement.NamespaceURI);
XmlNamespaceManager xmlNamespace = new XmlNamespaceManager(x.NameTable);
xmlNamespace.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
Console.WriteLine(x.SelectSingleNode("//xsl:template", xmlNamespace).NamespaceURI);
Console.WriteLine(x.SelectSingleNode("//xsl:template/html", xmlNamespace).NamespaceURI);
Console.ReadLine();