Как читать экранированные символы с помощью SAX-парсера в методе символов? - PullRequest
0 голосов
/ 17 октября 2011

Я анализирую следующий XML с помощью парсера:

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

Символьный метод синтаксического анализатора саксофона только читает данные адреса до 'lee h', так как он не рассматривает '&' какперсонаж.Мне нужно получить полный текст в элементе адреса.Есть идеи, как мне это сделать?Это мой синтаксический анализатор саксофона (здесь address - это флаг, который уведомляет, что элемент адреса присутствует в 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 ]

6 голосов
/ 17 октября 2011

Метод символов вызывается здесь три раза, чтобы сообщить о содержимом элемента Address из-за присутствия внешней сущности. Вы должны накапливать содержимое обращений к персонажам до тех пор, пока не получите событие endElement, а затем получите полный контент.

Обратите внимание на документацию о методе символов .

Вы также можете извлечь выгоду из использования метода ignorableWhitespace с проверяющим синтаксическим анализатором и соответствующей схемой (например, DTD), чтобы сообщить анализатору, какие пробелы игнорируются (из-за отступа).

В 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);
    }
}
0 голосов
/ 17 октября 2011

Ответ зависит в некоторой степени от того, какой парсер вы используете.

Вот краткое изложение вопроса: http://www.ibm.com/developerworks/xml/library/x-tipsaxdo4/index.html

С парсером StaX вы можете указать свойство isCoalescing = true. Это свойство specifies whether to coalesce adjacent adjacent character data.

Но в SAX такого контроля обычно нет.

...