QName是一个名称空间限定的名称.下面是包含两个QNames的XML
<ac:aircraft xmlns:ac="http://www.aircraft.org">
<ac:altitude>12,000 feet</ac:altitude>
</ac:aircraft>两个缩写的QNames是:
ac:aircraft
ac:altitude扩展的QNames是:
{http://www.aircraft.org}aircraft
{http://www.aircraft.org}altitudeXML解析器知道将短名称(缩写名称)转换为长名称(扩展名称)的规则。
名称的缩写形式是静态的--在解析时--可解析为长名称。
QNames也可以用于数据。在下面的XML中,<log>元素的值是QName
<network-traffic xmlns:network="http://www.network-traffic.org">
<log>network:client-error</log>
</network-traffic>XML解析器只对标记进行操作,而不对数据进行操作。因此,XML解析器不会将短名称转换为长名称。从短名称到长名称的映射必须由更高级别的应用程序完成,例如XSLT处理器或XML验证器。换句话说,短名到长名的解析必须是动态的,而不是静态的。
问题:为什么静态地将短名解析为长名更好呢?动态地将短名称解析为长名称的缺点是什么?您能否提供一个具体的示例,说明由于必须动态地将短名称解析为长名称而产生的问题?QNames静态分析的实际好处是什么?
发布于 2016-04-15 15:59:47
我认为迈克尔的观点是,名称空间前缀应该被看作是词汇上的方便。真正的限定名是(名称空间,名称)对,而不是(前缀,名称)对。一个名称空间可以使用几个不同的前缀来表示,甚至在同一个文档中也是如此。
区别往往并不重要。如果名称空间绑定可用,那么将前缀转换为名称空间非常简单。然而,一些开发人员变得懒惰,编写依赖于特定命名空间前缀的代码。这是一种脆弱的策略,因为如果XML信息集中的一部分被复制到其他地方,那么命名空间绑定的层次结构可能会改变,这些前缀的含义也会发生变化。为了防止这种情况,处理XML信息集的应用程序不应该提供直接访问前缀的API(除非为了操作前缀到命名空间绑定的目的)。相反,信息集应该包含每个节点的完整命名空间。如果您曾经在程序中调用过XPath处理器,那么您可能遇到了这个问题。XPath具有前缀感知能力,在执行XPath表达式之前,通常需要为XPath处理器设置一个“命名空间上下文”对象。否则,XPath表达式中的前缀可能会被错误地解释。
https://stackoverflow.com/questions/36604202
复制相似问题