我有以下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
为什么空间会出现输出?
答案 0 :(得分:2)
<Name>
标记的子文本节点的实际字符串值为
\nJames\n
同样,<Id>
中文本节点的字符串值为
\n11\n
其中\n
表示换行符。没有新行是可忽略的空格。如果要删除它们,必须在Java代码中自行完成。
答案 1 :(得分:1)
如果您通过模式(XSD)验证程序放置XML,并且使用折叠所有空格的类型声明Name和Id的类型,则可以为您删除空格,例如:输入xs:token。 DTD验证器永远不会对文本节点执行此操作(仅适用于属性节点)。
答案 2 :(得分:0)
如果您使用validating parser,则会通过ignorableWhitespace()
方法而非characters().
否则,解析器完全有权通过characters().
向您提供空白。请参阅Javadoc。