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

Sri*_*vas 0 xml parsing sax

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

<Person>
<Name>Test</Name>
<Phone>111-111-2222</OtherPhone>
<Address>lee h&amp;y</Address>
<Person>
Run Code Online (Sandbox Code Playgroud)

sax解析器的characters方法只读取地址数据,直到'lee h',因为它不将'&'视为一个字符.我需要在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;
            }
Run Code Online (Sandbox Code Playgroud)

输出是:: lee h

Lud*_*uty 6

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

请注意字符方法文档.

您还可以使用带有验证解析器和适当模式(例如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);
    }
}
Run Code Online (Sandbox Code Playgroud)