Проблема с SAXParser при захвате значения тега с символом &

У меня есть SAXParser с XMLReader.

SAXParserFactory saxPF = SAXParserFactory.newInstance();
SAXParser sp = saxPF .newSAXParser();
XMLReader xmlR = sp.getXMLReader();
MyHandler myHandler = new MyHandler();
xmlR .setContentHandler(myHandler );

Мой код обработчика использует startElement и endElement для обнаружения внутри тега. Он делает это, устанавливая логическое значение и используя символы() для получения значения.

public void startElement(String namespaceURI, 
    String localName, String qName, Attributes atts) throws SAXException {
    if (localName.equals("myTag")) this.in_myTag = true;
}

public void characters(char ch[], int start, int length) {
            if(in_myTag )  { c.setMyTag(new String(ch, start, length));
}

Проблема в том, что у меня есть тег «Значение A и B», и он уведомляет символы () для «A», «&», «B» и «Value». Таким образом, окончательное значение setMyTag равно «Value».

<myTag>A & B value</myTag>

http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html


person Ally    schedule 11.07.2010    source источник


Ответы (2)


<myTag>A & B value</myTag>

(Это не XML. Я предполагаю, что вы имеете в виду A &amp; B value, чтобы быть правильно сформированным.)

В общем, вы не можете гарантировать, что ваш обработчик characters() будет вызываться ровно один раз для каждого элемента. Если в элементе нет текстового содержимого, он вообще не будет вызываться; если есть ссылки на объекты или текст очень длинный, вам, вероятно, будут звонить более одного раза. Плюс, конечно, любые комментарии, PI или другие элементы определенно потребуют многократных вызовов.

Хотя для предопределенной ссылки на объект, такой как &amp;, необычно вызывать отдельный обратный вызов обработчику содержимого, в спецификации нет ничего, что говорило бы о том, что это не может произойти в любое время по какой-либо причине (или без нее). В частности :

Синтаксические анализаторы SAX могут возвращать все непрерывные символьные данные в одном фрагменте или могут разбивать их на несколько фрагментов.

Следовательно, обработчик SAX должен собирать каждый фрагмент текстового содержимого, отправленного ему, и объединять их вместе, когда происходит endElement, а не устанавливать содержимое из одного обратного вызова characters.

person bobince    schedule 11.07.2010
comment
У меня точно такая же проблема, и этот ответ прояснил ее для меня. Спасибо. - person Ryan R; 21.06.2011

Взгляните на этот Проблемы при синтаксическом анализе котировок с помощью синтаксического анализатора SAX (javax.xml.parsers.SAXParser) в Android API 1.5

Кстати, & - это неверный символ XML, он должен быть

person Fedor    schedule 11.07.2010
comment
Спасибо за ссылку на этот пост - person Ally; 11.07.2010