Java SAXParser:`localName` 和 `qName` 之间的区别

Posted

技术标签:

【中文标题】Java SAXParser:`localName` 和 `qName` 之间的区别【英文标题】:Java SAXParser: Different between `localName` and `qName` 【发布时间】:2012-03-15 03:29:54 【问题描述】:

在 Java 中,Handler 类包含名称为 startElement 的方法。此方法具有原型:

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

我在 Oracle Java 网站上阅读过,但我仍然不明白 localNameqName 参数之间有什么区别。他们在这里解释:

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

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

请谁能帮我解释一下(尽可能简单)这些参数。

谢谢:)

【问题讨论】:

查看***.com/questions/7157355/… en.wikipedia.org/wiki/QName 【参考方案1】:

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

示例:

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

QName x:pURI, local-name"http://example.com/ns/foo", "p". 的简洁、明确的名称,其中 doc 是本地名称。

Java 类比:

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

【讨论】:

【参考方案2】:

在 sax 解析器中有本地名称、qname 和命名空间

qname 是标签名称以及命名空间,而本地名称只是标签名称。本地名称可能不明确,但 qname 永远不会。

【讨论】:

【参考方案3】:

作为示例,我将参考以下 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 Schema 命名空间(带有 uri:http://www.w3.org/2001/XMLSchema)。在上面的文档中,它在第 2 行被引用。XML 文档处理可能会使用可识别名称空间或不识别名称空间的 XML 解析器进行,但使用名称空间的文档通常需要由可识别名称空间的解析器解析。

定义命名空间是为了 a) 解析器可以对它们进行编目 b) 不同命名空间中具有相同名称的元素可以存在于同一个文档中,而不会产生歧义。

前缀

前缀是用于引用命名空间的简写键。在上面的示例中,xs 用于引用 XML Schema 命名空间。

本地名称(部分)

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

限定名称 (qName)

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

【讨论】:

+1。限定名称段落中的倒数第二个句子不应该以“作为限定名称”而不是“作为本地名称”结尾吗? 是的,这就是剪切和粘贴开发不好的原因。 :D 哦。谢谢 :) 你的例子是如此简单易懂!在您的示例和解释之后,我阅读了另一篇关于此的文档并且比以往任何时候都理解。 这也是我关于这个主题的问题。你能为我解释一下吗:) ***.com/questions/9441593/… 非常清晰的解释。 “命名空间”这个词左右晃动:有一半时间我认为很多使用它的人都不太清楚它的含义。【参考方案4】:

Ryan 的回答非常好。您需要的唯一其他信息是 SAX 中 startElement 事件报告的确切细节取决于 SAX 解析器的各种配置设置。遗憾的是,我没有时间详细介绍 Ryan 所做的细致入微的工作。

【讨论】:

以上是关于Java SAXParser:`localName` 和 `qName` 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Java SAXParser 解析无效的 xml [重复]

SAXParser 无法解析某些字符

如何在 Java 中使用 SAX Parser 检查 xml 标签是不是具有属性?

为啥 SAXParser 在引发事件之前会读取这么多内容?

SAXParser - 从 XML 元素解码值后,仅获得字符长度 126

在SAXParser中禁用加载外部DTD