删除SAX Parser中的空格

时间:2013-10-06 06:29:32

标签: java xml xml-parsing sax

我有以下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

为什么空间会出现输出?

3 个答案:

答案 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