Java XMLReader не очищает многобайтовые атрибуты в кодировке UTF-8 - PullRequest
5 голосов
/ 12 апреля 2011

У меня действительно странная ситуация, когда мой SAX ContentHandler передает неверные атрибуты XMLReader. Анализируемый документ - это UTF-8 с многобайтовыми символами внутри атрибутов XML. Кажется, что эти атрибуты накапливаются при каждом вызове моего обработчика. Поэтому вместо последовательной передачи они объединяются со значением предыдущего узла.

Вот пример, который демонстрирует это, используя общедоступные данные (Википедия).

public class MyContentHandler extends org.xml.sax.helpers.DefaultHandler {

    public static void main(String[] args) {
        try {
            org.xml.sax.XMLReader reader = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
            reader.setContentHandler(new MyContentHandler());
            reader.parse("http://en.wikipedia.org/w/api.php?format=xml&action=query&list=allpages&apfilterredir=redirects&apdir=descending");

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes) {
        if ("p".equals(qName)) {
            String title = attributes.getValue("title");
            System.out.println(title);
        }
    }
}

Обновление: Этот полный пример выдает (извинения за любые кантонские спикеры за вульгарный вывод):

?
??
???
????
?????
??????
???????
????????
?????????
??????????

Кто-нибудь знает, что происходит и как это исправить? То, что возвращается в документе, не соответствует тому, что происходит, когда я отлаживаю этот фрагмент.

1 Ответ

1 голос
/ 12 апреля 2011

Кажется, что это ошибка во включенной в JRE версии Xerces (com.sun.org.apache.xerces.internal.parsers.SAXParser). Ниже мои заметки.

Версия в комплекте с JRE 1.6.0_24 , v2.4.0 , v2.5.0 , v2.6.0 * накапливает атрибутов.

Xerces-J v1.4.4 , похоже, не содержит ошибку.

Xerces2-J v2.6.1 , v2.6.2 , v2.9.0 , 2.11.0 не похоже, есть ошибка.

По проверенным версиям вы можете сказать, что я делил историю версий на части. Кажется, что-то фиксированное между v2.6.0 и v2.6.1 . Я немного удивлен, что JRE не был обновлен, поскольку он был исправлен в основном Xerces около 7 лет назад!

...