1

AQName是命名空间限定的名称。这是包含两个的 XML QNames

<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}altitude

XML 解析器知道将短名称(缩写名称)转换为长名称(扩展名称)的规则。

名称的缩写形式是静态的——在解析时——可解析为长名称。

QNames也可用于数据。在以下 XML 中,<log>元素的值为 a QName

<network-traffic xmlns:network="http://www.network-traffic.org">
      <log>network:client-error</log>
</network-traffic>

XML 解析器仅对标记进行操作,而不对数据进行操作。因此,XML 解析器不会将短名称转换为长名称。从短名称到长名称的映射必须由更高级别的应用程序完成,例如 XSLT 处理器或 XML Schema 验证器。换句话说,短名称到长名称的解析必须是动态的,而不是静态的。

问题:为什么将短名称静态解析为长名称更好?将短名称动态解析为长名称的缺点是什么?您能否提供一个具体示例,说明由于必须将短名称动态解析为长名称而导致的问题?QName 的静态分析有哪些实际好处?

4

1 回答 1

1

我认为 Micheal 的观点是命名空间前缀应该被视为一种词汇便利。真正的限定名称是 (namespace,name) 对,而不是 (prefix, name) 对。即使在同一个文档中,一个命名空间也可能使用几个不同的前缀来表示。
区别通常无关紧要。如果命名空间绑定可用,那么从前缀转换为命名空间就很简单了。但是,一些开发人员变得懒惰并编写依赖于特定命名空间前缀的代码。这是一个脆弱的策略,因为如果 XML 信息集的一部分被复制到其他地方,那么名称空间绑定的层次结构可能会改变,并且这些前缀的含义也可能会改变。为了防止这种情况,处理 XML 信息集的应用程序不应提供提供对前缀的直接访问的 API(除非出于操作前缀到命名空间绑定的目的)。相反,信息集应该包含每个节点的完整命名空间。如果您曾经在程序中调用过 XPath 处理器,那么您可能遇到过这个问题。XPath 是前缀感知的,并且它' 在执行 XPath 表达式之前,通常需要为 XPath 处理器设置一个“命名空间上下文”对象。否则 XPath 表达式中的前缀可能会被错误地解释。

于 2016-04-15T15:59:47.600 回答