使用 Sax Parser、Java 处理 XML 中的空标签

Posted

技术标签:

【中文标题】使用 Sax Parser、Java 处理 XML 中的空标签【英文标题】:Handling Empty Tags in XML using Sax Parser, Java 【发布时间】:2012-06-04 12:07:31 【问题描述】:

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

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

【问题讨论】:

【参考方案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()

就是这样!结束

【讨论】:

以上是关于使用 Sax Parser、Java 处理 XML 中的空标签的主要内容,如果未能解决你的问题,请参考以下文章

XML Pull Parser 和 SAX Parser 有啥区别

使用 SAX Parser 进行 Android XML 解析

如何在 android 中使用 SAX Parser 为解析的 xml 文件设置 UTF-8

如何在Ruby on Rails上使用SAX解析器来处理大型XML文件

使用 SAX Parser,获取属性的值

Android SAX XML Parser Access Enclosure 标签 URL 属性