2

characters()我有以下 XML 文件。为什么即使在应用验证之后也会出现空格

<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

为什么空间会在输出中出现?

4

3 回答 3

2

<Name>作为标记子节点的文本节点的实际字符串值为

\nJames\n

同样,文本节点的字符串值<Id>

\n11\n

其中\n表示换行符。没有一个换行符是可忽略的空白。如果你想删除它们,你必须在你的 Java 代码中自己做。

于 2013-10-06T07:58:09.007 回答
2

如果您将 XML 放入模式 (XSD) 验证器并使用折叠所有空格的类型(例如 xs:token 类型)声明 Name 和 Id 的类型,则可以为您删除空格。DTD 验证器永远不会对文本节点执行此操作(仅对属性节点)。

于 2013-10-06T08:02:29.230 回答
0

如果您使用验证解析器,它将通过ignorableWhitespace()方法而不是报告可忽略的空格characters().

否则,解析器完全有权通过characters().See the Javadoc为您提供空格。

于 2013-10-06T06:35:47.437 回答