Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么静态解析XML QNames比动态解析XML QNames更好?_Xml_Xslt_Xsd_Static Analysis_Qnames - Fatal编程技术网

为什么静态解析XML QNames比动态解析XML QNames更好?

为什么静态解析XML QNames比动态解析XML QNames更好?,xml,xslt,xsd,static-analysis,qnames,Xml,Xslt,Xsd,Static Analysis,Qnames,QName是命名空间限定名称。下面是包含两个qname的XML: <ac:aircraft xmlns:ac="http://www.aircraft.org"> <ac:altitude>12,000 feet</ac:altitude> </ac:aircraft> 扩展的qname为: ac:aircraft ac:altitude {http://www.aircraft.org}aircraft {http://www.air

QName
是命名空间限定名称。下面是包含两个
qname
的XML:

<ac:aircraft xmlns:ac="http://www.aircraft.org">
    <ac:altitude>12,000 feet</ac:altitude>
</ac:aircraft>
扩展的
qname
为:

ac:aircraft
ac:altitude
{http://www.aircraft.org}aircraft
{http://www.aircraft.org}altitude
XML解析器知道将短名称(缩写名称)转换为长名称(扩展名称)的规则

名称的缩写形式在解析时静态地解析为长名称

QNames
也可用于数据中。在下面的XML中,
元素的值是一个
QName

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

网络:客户端错误
XML解析器只对标记而不是数据进行操作。因此,XML解析器不会将短名称转换为长名称。从短名称到长名称的映射必须由更高级别的应用程序(如XSLT处理器或XML模式验证器)完成。换句话说,短名称到长名称的解析必须是动态的,而不是静态的


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

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

不确定为什么要问这个问题,因此很难做出有效的回答。您能解释一下为什么想知道吗?在xml开发列表中,Michael Kay描述了xml名称空间的一些问题。他写道:如果名称的缩写形式被允许,那么它应该总是静态地解析为长名称。这在“内容中的QNames”的情况下是不可能的,因为知道将短名称转换为长名称的规则的软件组件(XML解析器)无法检测到短名称的存在,因此无法扩展它;因此,它必须使短名称到长名称的映射可用于系统中的其他组件。。。我想更好地理解这一点。相关: