【问题标题】:Java SAXParser: Different between `localName` and `qName`Java SAXParser:`localName` 和 `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

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

谢谢:)

【问题讨论】:

标签: java xml terminology sax


【解决方案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:p{URI, 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
      • 哦。谢谢 :) 你的例子是如此简单易懂!在您的示例和解释之后,我阅读了另一篇关于此的文档并且比以往任何时候都理解。
      • 这也是我关于这个主题的问题。你能为我解释一下吗:) stackoverflow.com/questions/9441593/…
      • 非常清晰的解释。 “命名空间”这个词左右晃动:有一半时间我认为很多使用它的人都不太清楚它的含义。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 2015-04-06
        • 1970-01-01
        • 2012-01-15
        • 2012-01-21
        • 2016-06-29
        • 2012-09-03
        • 2016-03-28
        • 2017-12-23
        相关资源
        最近更新 更多