在 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】:

作为&lt;Name&gt;标签子节点的文本节点的实际字符串值为

\nJames\n

同样,&lt;Id&gt;中文本节点的字符串值为

\n11\n

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在 SAX 解析器中删除空格的主要内容,如果未能解决你的问题,请参考以下文章

在BlackBerry中使用SAX解析器解析XML

Java中的解析字节数组

jaxp解析器——sax

SAX 解析器与 XMLPull 解析器

使用 SAX 解析器解析 Xml

使用 SAX 解析器确定是不是在叶节点