7

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

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

4

3 回答 3

2

你做吧。如果你有 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()

而已!结束

于 2017-11-10T07:38:48.957 回答
1

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

于 2014-01-27T07:43:57.273 回答
0

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

于 2012-05-30T09:40:27.673 回答