【发布时间】:2023-04-03 09:20:01
【问题描述】:
我正在使用 Sax 解析器来处理预先编写的 XML 文件....我无法更改 XML,因为它由另一个应用程序持有,但需要从中解析数据。 XML 文件包含一个标签
如何让 SAX 识别这是一个空标签并将值返回为 "" ?
【问题讨论】:
我正在使用 Sax 解析器来处理预先编写的 XML 文件....我无法更改 XML,因为它由另一个应用程序持有,但需要从中解析数据。 XML 文件包含一个标签
如何让 SAX 识别这是一个空标签并将值返回为 "" ?
【问题讨论】:
你没有。 SAX 的工作是解析数据,而不是决定数据的内容应该是什么。 在您的 parseHandler 中,将数据字符串存储在所有元素中,当您处理该元素时,对数据执行 string.trim()。如果它的输出是空白的并且你的标签是一个 ERROR_TEXT 标签,你就知道没有错误。
【讨论】:
SAXParser 通过characters() 事件返回cDAta,它在遇到“字符”字面意思时调用该事件。使用该函数是没有意义的,因为它在每个打开的标签之后调用,无论它是否实际包含任何数据。您可以使用String.trim() 并在继续之前进行String.length()>=0 检查。
【讨论】:
你这样做。如果你有 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()
就是这样!结束
【讨论】: