在 SAX 解析器中删除空格
Posted
技术标签:
【中文标题】在 SAX 解析器中删除空格【英文标题】:Removing whitespace in SAX Parser 【发布时间】:2013-10-12 22:04:06 【问题描述】:我有以下 XML 文件。为什么即使在应用验证之后,characters()
也会出现空格
<Employee>
<Name>
James
</Name>
<Id>
11
</Id>
</Employee>
我正在尝试在标签之间显示文本。
public class MyHandler extends DefaultHandler
boolean isName = false;
boolean isId = false;
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException
if (isName)
System.out.println(new String(arg0, arg1, arg2));
isName = false;
if (isId)
System.out.println(new String(arg0, arg1, arg2));
isId = false;
@Override
public void startElement(String arg0, String arg1, String arg2,
Attributes arg3) throws SAXException
if (arg2.equalsIgnoreCase("Name"))
isName = true;
if (arg2.equalsIgnoreCase("Id"))
isId = true;
期望的输出:
James
11
实际输出:
James
11
为什么会输出空格?
【问题讨论】:
【参考方案1】:如果您使用validating parser,它将通过ignorableWhitespace()
方法而不是characters().
报告可忽略的空格
否则解析器完全有权通过characters().
为您提供空格,请参阅Javadoc。
【讨论】:
它不会在标签之间给我文本。 @Sanjana 我不明白你的评论。请解释一下。【参考方案2】:作为<Name>
标签子节点的文本节点的实际字符串值为
\nJames\n
同样,<Id>
中文本节点的字符串值为
\n11\n
其中\n
表示换行符。没有一个换行符是可忽略的空白。如果你想删除它们,你必须自己在你的 Java 代码中完成。
【讨论】:
【参考方案3】:如果您将 XML 放入架构 (XSD) 验证器并使用折叠所有空格的类型声明 Name 和 Id 的类型,则可以为您删除空格,例如输入 xs:token。 DTD 验证器永远不会对文本节点执行此操作(仅对属性节点)。
【讨论】:
以上是关于在 SAX 解析器中删除空格的主要内容,如果未能解决你的问题,请参考以下文章