【问题标题】:localName versus qName in SAXSAX 中的 localName 与 qName
【发布时间】:2015-04-06 03:05:30
【问题描述】:

在Java中使用SAX解析XML文件时,SAX等方法中参数localNameqName有什么区别

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

有时我可以从localName 获得一个值,但现在我什么也没得到。 一个 SAXParserFactory 的修订版是 884950;另一个是1.5。我根本不使用命名空间。有关系吗?

【问题讨论】:

    标签: xml xml-parsing sax


    【解决方案1】:

    是的,是否使用命名空间非常重要,特别是如何配置 SAX 以使用它们...

    XML 名称术语

    qName 是完整的qualified name,包括namespace prefix(如果有)和localName

    所以,对于abc:xyz

    • 命名空间前缀abc
    • localNamexyz
    • qNameabc:xyz

    SAX 配置

    要为命名空间处理配置两个关键特性:

    1. http://xml.org/sax/features/namespaces (命名空间)
    2. http://xml.org/sax/features/namespace-prefixes (命名空间前缀)

    它们的设置将影响通过urilocalNameqName报告给startElement的值,

    public void startElement (String uri, String localName,
                              String qName, Attributes atts)
      throws SAXException;
    

    可能与您的期望不同的组合。考虑以下examples

    配置示例

    考虑以下简单的示例文档:

    <?xml version="1.0"?>
    <h:hello xmlns:h="http://www.greeting.com/ns/"
             id="a1" h:person="David"/>
    

    如果 namespaces 为真且 namespace-prefixes 为假( 默认),然后 SAX2 XML 阅读器将报告以下内容:

    • 具有命名空间 URI“http://www.greeting.com/ns/”和本地名称“hello”的元素;
    • 一个没有命名空间URI(空字符串)和qName(通常是localName)“id”的属性;和
    • 具有命名空间 URI“http://www.greeting.com/ns/”和本地名称“person”的属性。

    如果 namespaces 为真且 namespace-prefixes 为真,则 SAX2 XML 阅读器将报告以下内容:

    • 具有命名空间 URI “http://www.greeting.com/ns/”、localName “hello”和 qName “h:hello”的元素;
    • 一个没有命名空间URI(空字符串)、没有localName(空字符串)和qName“xmlns:h”的属性;
    • 一个没有命名空间URI(空字符串)和qName(通常是localName)“id”的属性;和
    • 具有命名空间 URI“http://www.greeting.com/ns/”、localName“person”和 qName“h:person”的属性。

    如果 namespaces 为假且 namespace-prefixes 为真,则 SAX2 XML 阅读器将报告以下内容:

    • qName 为“h:hello”的元素;
    • qName 为“xmlns:h”的属性;
    • 具有 qName“id”的属性;和
    • qName 为“h:person”的属性。

    请注意,当 SAX2 报告命名空间声明属性时,例如 “xmlns:h”,它符合XML 中的命名空间 建议 W3C:它们不在任何命名空间中。其他一些 W3C 规范 违反该规范,并将此类声明放入 http://www.w3.org/2000/xmlns/ 命名空间。如果您正在与 命名空间声明,您可能需要注意这个问题。

    【讨论】:

    • 对此的另外几个观察。 (1) 当 namespace-prefixes 属性为 false 时,解析器不需要报告 qName,但所有已知的解析器都会这样做。 (2) 编写一个接受来自不受您控制的任意 XMLReader 输入的 ContentHandler 尤其成问题,因为您无法发现namespacesnamespace-prefixes 的设置是什么。这时候了解 (1) 很有用,因为否则很难满足所有组合。
    猜你喜欢
    • 2012-03-15
    • 2011-11-01
    • 2012-03-15
    • 2012-01-15
    • 2010-09-12
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多