如何在Characters方法中使用SAX解析器读取转义字符?

时间:2011-10-17 19:16:15

标签: xml parsing sax

我正在使用解析器解析以下XML:

<Person>
<Name>Test</Name>
<Phone>111-111-2222</OtherPhone>
<Address>lee h&amp;y</Address>
<Person>

sax解析器的characters方法只读取地址数据直到'lee h',因为它不考虑'&amp;'作为一个角色。我需要在address元素中获取完整的文本。关于我应该如何做的任何想法?这是我的sax解析器(这里的地址是一个标志,表示XML中存在一个地址元素):

boolean address=false;

 public void startElement(String uri, String localName,
            String qName, Attributes attributes)
            throws SAXException {


        if (qName.equalsIgnoreCase("Address")) {
            address= true;

        }

    public void characters(char ch[], int start, int length)
                throws SAXException {

            String data = new String(ch, start, length);


            if (address) {

                System.out.println("Address is: "+data);
                address = false;
            }

,输出为:: lee h

2 个答案:

答案 0 :(得分:6)

此处调用characters方法三次,以报告元素Address的内容,因为存在外部实体。您应该累积对字符的调用内容,直到您收到endElement事件,然后您就拥有了完整的内容。

请注意documentation of the characters method

您还可以使用带有验证解析器和适当模式(例如DTD)的ignorableWhitespace方法,让解析器知道哪些空格是可忽略的(由于缩进)。

在Java中,它可能是:

class MyHandler extends DefaultHandler {

    private StringBuilder acc;

    public MyHandler() {
        acc = new StringBuilder();
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.printf("Characters accumulated: %s\n", acc.toString());
        acc.setLength(0);
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        acc.append(ch, start, length);
    }
}

答案 1 :(得分:0)

答案在某种程度上取决于您使用的解析器。

以下是该问题的详尽说明:http://www.ibm.com/developerworks/xml/library/x-tipsaxdo4/index.html

使用StaX解析器,您可以指定属性isCoalescing = true。此属性specifies whether to coalesce adjacent adjacent character data.

但是对于SAX,通常没有这样的控制。