【问题标题】:Handling Empty Tags in XML using Sax Parser, Java使用 Sax Parser、Java 处理 XML 中的空标签
【发布时间】:2023-04-03 09:20:01
【问题描述】:

我正在使用 Sax 解析器来处理预先编写的 XML 文件....我无法更改 XML,因为它由另一个应用程序持有,但需要从中解析数据。 XML 文件包含一个标签 未发生错误时为空。 结果,解析器在标签关闭之后获取下一个字符,即“\n”。 我努力了 result.replaceAll("\n", ""); 和 result.replaceAll("\n", "");

如何让 SAX 识别这是一个空标签并将值返回为 "" ?

【问题讨论】:

    标签: java xml sax saxparser


    【解决方案1】:

    你没有。 SAX 的工作是解析数据,而不是决定数据的内容应该是什么。 在您的 parseHandler 中,将数据字符串存储在所有元素中,当您处理该元素时,对数据执行 string.trim()。如果它的输出是空白的并且你的标签是一个 ERROR_TEXT 标签,你就知道没有错误。

    【讨论】:

    • 'string.trim()' 不会删除 \n。调试时字符串显示为“\n”。
    • Sax 解析器无法识别空标签,而是在其后获取返回字符。
    • 它应该返回一个开始元素,结束元素和中间的一些空白字符。这不是你得到的吗?如果要检查 \n 字符,请替换这些字符和空格,然后进行修剪。
    • 没有看到标签是这样的 之后的第一个字符恰好是 \n
    • 你不能改变它给你的东西。为什么忽略 \n 会出现问题?您使用的是默认处理程序还是您自己的处理程序?如果您使用自己的标签,则很容易确定标签为空。如果没有,如果您正在寻找一个字符串并且您得到空格,那么应该不难忽略它。如果这对您来说是个大问题,请使用 dom 解析器而不是 sax
    【解决方案2】:

    SAXParser 通过characters() 事件返回cDAta,它在遇到“字符”字面意思时调用该事件。使用该函数是没有意义的,因为它在每个打开的标签之后调用,无论它是否实际包含任何数据。您可以使用String.trim() 并在继续之前进行String.length()>=0 检查。

    【讨论】:

    • 谢谢,它对我有用。但我仍然认为如果没有数据,它应该只返回一个空字符串。
    • @Frederic 2018 我同意你的看法 :)
    【解决方案3】:

    你这样做。如果你有 xml 和 Java 源代码。

    <ERROR_TEXT>easy</ERROR_TEXT><ERROR_TEXT/>
    

    Java 代码

    private boolean isKeySet = false;
    private String key = "";
    @Override
    public void characters(
        char[] ch,
        int start,
        int length
    ) throws SAXException
    {
        if (!isKeySet) {
            return;
        }
        isKeySet = false;
        logger.debug("key : [" + key + "], value : [" + value + "]");
    }
    @Override
    public void startElement(
        String uri,
        String localName,
        String qName,
        Attributes attrs
    ) throws SAXException
    {
        key = qName;
        isKeySet = true;
    }
    
    @Override
    public void endElement(
        String uri,
        String localName,
        String qName
    ) throws SAXException
    {
        if (isKeySet) {
            isKeySet = false;
            logger.debug("key : [" + key + "](EMPTY!!!)");
        }
    }
    

    结果日志:

    键:[ERROR_TEXT],值:[简单]

    键:[ERROR_TEXT](空!!!)

    调用流程:startElement() -> characters() -> endElement() -> startElement() -> endElement() -> characters()

    就是这样!结束

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 2011-12-18
      • 2012-11-16
      • 2011-11-03
      • 1970-01-01
      • 2014-07-19
      • 2011-07-01
      • 2016-09-30
      • 1970-01-01
      相关资源
      最近更新 更多