【问题标题】:not able to parse tags using sax parser无法使用 sax 解析器解析标签
【发布时间】:2012-09-23 09:42:16
【问题描述】:

以下是我的 xml:

 <Body>
  <tag1 xmlns=""> <innerTag></innerTag> </tag1>
  </Body>

问题是我无法获取&lt;tag1&gt;&lt;/tag1&gt; 中的字符串,即&lt;innerTag&gt;&lt;/innerTag&gt;。以下是我的逻辑:

public void startElement(final String uri, final String localName,
            final String qName, final Attributes attributes)
            throws SAXException {
        if ("tag1".equalsIgnoreCase(qName)){
            inTag1 = true;
            System.out.println("start");
        }
}


public void endElement(final String uri, final String localName,
            final String qName) throws SAXException {
        if ("tag1".equalsIgnoreCase(qName)) {
            System.out.println("end");
            inTag1 = false;
        }
}

public void characters(final char[] ch, final int start, final int length) {

        if (inTag1) {
            System.out.println("@@@" + new String(ch, start, length));
        }
    }
}

但它给了我空的输出。谁能帮忙。

【问题讨论】:

  • innerTag 是一个元素,不是字符串或文本节点。如果要打印,则必须在startElementendElement 回调中进行。
  • &lt;innerTag&gt; 将由startElement 处理(结束标记由endElement 处理,只需在条件的else 部分打印qname)。所以characters 处理程序不会看到它们。

标签: java sax saxparser


【解决方案1】:

在您对 UVM 的回答中您写的评论中

其实inner tag就是这个xml里面的一种xml。所以我想要它作为一个整体

没有办法告诉 SAX 解析器不处理元素内的所有 XML 并将整个内容作为字符串返回。本质上,您有两个选择:

  • 通过监听所有 SAX 事件并自己构建 XML 字符串来重构 XML 字符串,或者
  • 如果您可以控制要解析的 XML 文档,请将它们的格式更改为类似

    <Body>
      <tag1 xmlns=""><![CDATA[ <innerTag></innerTag> ]]></tag1>
    </Body>
    

【讨论】:

    【解决方案2】:

    您需要检查"innerTag" 而不是"tag1"

    if ("innerTag".equalsIgnoreCase(qName)){
                inTag1 = true;
                System.out.println("start");
            }
    

    基本上你的 innerTag 是 tag1 的一个子元素。所以 SAX 解析器继续解析,因为它直到一个有效的 XML 元素。

    【讨论】:

    • 其实inner tag就是这个xml里面的一种xml。所以我想要它作为一个整体。
    • 你不会得到它,因为 SAX 解析器在基于事件的解析中。如果你想要的话,你将不得不手动进行。在上面的代码中,如果解析器看到这个 innertag ,那么你需要自己构造它的xml字符串
    猜你喜欢
    • 2013-01-08
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2020-08-09
    • 1970-01-01
    • 2011-04-30
    • 2012-11-16
    相关资源
    最近更新 更多