【发布时间】:2011-11-01 17:01:58
【问题描述】:
在Java中使用SAX解析XML文件时,startElement(String uri, String localName,String qName, Attributes attributes)等SAX方法中参数localname和qname有什么区别?
【问题讨论】:
在Java中使用SAX解析XML文件时,startElement(String uri, String localName,String qName, Attributes attributes)等SAX方法中参数localname和qname有什么区别?
【问题讨论】:
默认情况下,XML 阅读器将在开始和结束处理程序中报告属于命名空间的每个元素的命名空间 URI 和本地名称。
考虑以下示例:
<html:hr xmlns:html="http://www.w3.org/1999/xhtml"/>
使用默认的 SAX2 命名空间处理,XML 阅读器将使用命名空间 URI http://www.w3.org/1999/xhtml 和 localName hr 报告开始和结束元素事件。大多数 XMLReader 实现还报告原始 qName html:hr,但该参数可能只是一个空字符串(不在命名空间中的元素除外)。
【讨论】:
{http://www.w3.org/1999/xhtml}hr。因为前缀将元素绑定到命名空间,但它的实际字符串应该无关紧要。 Qualified = 命名空间和本地名称。
prefix+":"+localname。 (但您可以通过查看 Javadoc 或解析器的输出来发现这一点——您为什么要在这里问?)
一般来说,localname 是本地名称,意思是在命名空间内。 qname 或限定名是全名(包括命名空间)。例如, 将有一个本地名称 b,但有一个 qname a:b。
然而,这是非常通用的,并且取决于设置。查看本页末尾的示例以获得更详尽的示例:example
【讨论】:
限定名称包括命名空间前缀和本地名称: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"
【讨论】: