使用 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 文件包含一个标签
如何让 SAX 识别这是一个空标签并将值返回为 "" ?
【问题讨论】:
【参考方案1】:你没有。 SAX 的工作是解析数据,而不是决定数据的内容应该是什么。 在您的 parseHandler 中,将数据字符串存储在所有元素中,当您处理该元素时,对数据执行 string.trim()。如果它的输出是空白的并且你的标签是一个 ERROR_TEXT 标签,你就知道没有错误。
【讨论】:
'string.trim()' 不会删除 \n。调试时字符串显示为“\n”。 Sax 解析器无法识别空标签,而是在其后获取返回字符。 它应该返回一个开始元素,结束元素和中间的一些空白字符。这不是你得到的吗?如果要检查 \n 字符,请替换这些字符和空格,然后进行修剪。 没有看到标签是这样的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