Проблема SAXParser при получении значения тега с символом & - PullRequest
1 голос
/ 11 июля 2010

У меня есть 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» и уведомляющие символы () для «А"и" & "и" B "и" Value ".Таким образом, окончательное значение setMyTag равно «Значение»

<myTag>A & B value</myTag>

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

Ответы [ 2 ]

3 голосов
/ 11 июля 2010
<myTag>A & B value</myTag>

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

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

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

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

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

0 голосов
/ 11 июля 2010
...