SAX解析和特殊字符(SAX parsing and special characters)

2019-07-03 18:38发布

我想从使用SAX解析器XML文件解析的一些数据。 我的XML如下:

<categories>
 <cat>Pies &amp; past</cat>
 <cat>Fruits</cat>
</categories>

为了解析这些数据我伸出的DefaultHandler。

解析后的输出是:

cat 1 = Pies

cat 2 = &

cat 3 = past

cat 4 = Fruits

这究竟是为什么而不是得到:

cat 1 = Pies & past

cat 2 = Fruits

Answer 1:

我的猜测是,你是治疗每次调用characters为提供完整的文本的cat元素。 你应该编写你的处理程序,以便于连续通话characters积累的文本,你只能捕捉到它的endElement事件:

public class CatHandler extends DefaultHandler {
    private StringBuilder chars = new StringBuilder();

    public void startElement(String uri, String lName, String qName, Attributes a)
    {
        final String name = qName == null ? lName : qName;
        if ("cat".equals(name)) {
            chars.setLength(0);
        } else . . .
    }

    public void endElement(String uri, String lName, String qName) {
        final String name = qName == null ? lName : qName;
        if ("cat".equals(name)) {
            String catName = chars.toString();
            // do something with cat name
        } else . . .
    }

    public void characters(char[] ch, int start, int length) {
        chars.append(ch, start, length);
    }


Answer 2:

characters()方法没有返回完整的文本元素。 相反,你应该在整理每个可用文本characters()调用,并连接这些在相应endElement()调用。

从该文档 :

解析器将调用此方法来报告字符数据的每个存储块。 SAX解析器可以在单个块返回所有连续的字符数据, 或者它们可把它分割成若干块

(我的重点)



文章来源: SAX parsing and special characters