在Java中使用SAX解析XML文件时,像
startElement(String uri, String localName,String qName, Attributes attributes)
这样的SAX方法中的localname和qname参数有什么区别?限定名称包括命名空间前缀和本地名称:att1
和 foo: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"
一般而言,localname 是局部名称,即命名空间内的名称。qname(限定名称)是完整的名称(包括命名空间)。例如,<a:b …> 将具有局部名称 b,但 qname 是 a:b。
然而,这非常普遍且依赖于设置。请查看本页面末尾的示例,以获取更详细的信息:示例
默认情况下,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.w3.org/1999/xhtml}hr
。因为前缀将元素绑定到一个命名空间,但其实际字符串应该无关紧要。限定 = 命名空间和本地名称。 - G_Hprefix+":"+localname
。(但您可以通过查看Javadoc或解析器的输出来找到答案 - 为什么要在这里问呢?) - Michael Kay