本地名称(localname)和限定名称(qname)有什么区别?

33
在Java中使用SAX解析XML文件时,像startElement(String uri, String localName,String qName, Attributes attributes)这样的SAX方法中的localnameqname参数有什么区别?
3个回答

45

限定名称包括命名空间前缀和本地名称:att1foo:att2

示例 XML

<root 
    xmlns="http://www.example.com/DEFAULT" 
    att1="Hello" 
    xmlns:foo="http://www.example.com/FOO" 
    foo:att2="World"/>

Java 代码:

att1

没有命名空间前缀的属性不会选择默认命名空间。这意味着,虽然 root 元素的命名空间为 "http://www.example.com/DEFAULT",但 att1 属性的命名空间为 ""

int att1Index = attributes.getIndex("", "att1");
attributes.getLocalName(att1Index);  // returns "att1"
attributes.getQName(att1Index);  // returns "att1"
attributes.getURI(att1Index);  // returns ""

att2

int att2Index = attributes.getIndex("http://www.example.com/FOO", "att2");
attributes.getLocalName(att2Index);  // returns "att2"
attributes.getQName(att2Index);  // returns "foo:att2"
attributes.getURI(att2Index);  // returns "http://www.example.com/FOO"

13

一般而言,localname 是局部名称,即命名空间内的名称。qname(限定名称)是完整的名称(包括命名空间)。例如,<a:b …> 将具有局部名称 b,但 qname 是 a:b。

然而,这非常普遍且依赖于设置。请查看本页面末尾的示例,以获取更详细的信息:示例


0

默认情况下,XML读取器将在开始和结束处理程序中为属于命名空间的每个元素报告命名空间URI和localName。

考虑以下示例:

  <html:hr xmlns:html="http://www.w3.org/1999/xhtml"/>

使用默认的SAX2命名空间处理,XML读取器将报告具有命名空间URI http://www.w3.org/1999/xhtml 和本地名称hr的开始和结束元素事件。大多数XMLReader实现还会报告原始qName html:hr,但该参数可能只是一个空字符串(除了不在命名空间中的元素)。

http://www.saxproject.org/namespaces.html


问题:qName 将是前缀 + ':' + 本地名称,还是 '{' + 命名空间 URI + '}' + 本地名称?就像这样:{http://www.w3.org/1999/xhtml}hr。因为前缀将元素绑定到一个命名空间,但其实际字符串应该无关紧要。限定 = 命名空间和本地名称。 - G_H
1
它将是 prefix+":"+localname。(但您可以通过查看Javadoc或解析器的输出来找到答案 - 为什么要在这里问呢?) - Michael Kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接