Java SAX解析器:`localName`和`qName`的区别

13
在Java中,Handler类包含名为startElement的方法。该方法有以下原型:

public void startElement(String uri, String localName, String qName, Attributes attributes)

我已经阅读了Oracle Java网站上的资料,但仍不理解localNameqName参数之间的区别。这里有他们的解释:

localName - 本地名称(不带前缀),或如果未执行命名空间处理,则为空字符串。 qName - 限定的 XML 1.0 名称(带前缀),或者如果不可用则为空字符串。

在上面的定义中,我不知道一些概念:prefix (什么的前缀?) Namespace

谁能尽可能简单地为我解释一下这些参数,请。

谢谢 :)


请查看https://dev59.com/VGw05IYBdhLWcg3wkivX。 - Siddharth
http://en.wikipedia.org/wiki/QName - skaffman
4个回答

31

作为一个例子,我要引用以下 XML 示例:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to" type="xs:string"/>
        <xs:element name="from" type="xs:string"/>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

命名空间

命名空间是定义元素的逻辑容器。XML模式命名空间(具有URI:http://www.w3.org/2001/XMLSchema)。在上面的文档中,它在第2行被引用。XML文档处理可以使用支持或不支持命名空间的XML解析器,但是使用命名空间的文档通常需要由支持命名空间的解析器进行解析。

命名空间是为了a)能够被解析器编目和b)使不同命名空间中具有相同名称的元素可以存在于同一文档中而不会变得含糊。

前缀

前缀是用于引用命名空间的缩写键。在上面的例子中,xs用于引用XML模式命名空间。

本地名称(部分)

文档中的元素具有在命名空间中定义的名称。在上面的例子中,您可以在本地名称中找到schemaelementcomplexTypesequenceelement。如果您的文档中引用了多个命名空间,并且其中一个或多个命名空间定义了具有相同名称的元素,则本地名称可能具有歧义。

限定名称(qName)

限定名称由命名空间前缀(可选,某些实现可以使用命名空间URI)、后跟:、再后跟元素的本地名称组成。在上面的例子中,您可以找到xs:schemaxs:elementxs:complexTypexs:sequencexs:element作为限定名称。这些名称是无歧义的,并且可以由解析器进行处理和验证。


+1. "限定名称"段落中倒数第二句话应该以"作为限定名称"而不是"作为本地名称"结尾,对吗? - Nathan Hughes
3
没错,这就是为什么“复制粘贴”式的开发不好。:D - Ryan Ransford
3
哦,谢谢 :) 您的例子非常简单易懂!!!在您的例子和解释之后,我阅读了另一份关于这个的文档,比以往更加理解。 - hqt
2
这是关于编程的话题,我也有一个问题。你能为我解释一下吗?http://stackoverflow.com/questions/9441593/xml-sax-explain-result-in-qname-and-localname-in-one-example-xml-file - hqt
非常清晰的解释。"命名空间"这个词被到处乱扔:我认为很多使用它的人并不完全清楚它的含义。 - mike rodent

2

QNamesQualified Name)是由XML命名空间引入的,以便用作URI引用。QName为元素和属性定义了有效的标识符。通常使用QNames来引用XML文档中特定的元素和属性,并提供了一种简洁地标识{URI,local-name}对的机制。命名空间也可以在XML根元素中声明。

示例:

<?xml version='1.0'?>
  <doc xmlns:x="http://example.com/ns/foo">
    <x:p/>
  </doc>  

QName x:p 是一个简洁、明确的名称,用于表示 {"http://example.com/ns/foo", "p"} 这个 {URI, local-name} 对。其中 doc 是本地名称。

Java 类比:

com.prem.java.Employee employee; //creating object using fully qualified name i.e. QName
Student student; //create an object using local name

1
在 sax 解析器中,有本地名称、qname 和命名空间。
qname 是标签名称和命名空间的组合,而本地名称仅是标签名称。本地名称可能会产生歧义,但 qname 永远不会。

1

Ryan的回答非常出色。你需要知道的唯一其他信息是,在SAX的startElement事件中报告的确切细节取决于SAX解析器的各种配置设置。可惜,我没有时间像Ryan那样详细地说明。


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