Проблема SAX XML Java Entities

У меня проблема с SAX и Java.

Я разбираю xml-файл базы данных цифровой библиотеки dblp (который перечисляет журнал, конференции, статьи). Файл XML очень большой (> 700 МБ).

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

т. е.: R&uuml;diger Mecke — это исходное имя автора, заключенное между тегами <author>.

üdiger Mecke это результат

(Строка, возвращаемая методом characters (ch[], start, length)).

Я бы хотел знать:

  1. как запретить PARser автоматически разрешать сущности?
  2. как решить проблему с усеченными символами, описанную ранее?

person user278064    schedule 29.12.2010    source источник


Ответы (2)


characters() не гарантирует возврат всех символов за один вызов. Из Javadoc:

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

Вам нужно добавить символы, возвращаемые во всех вызовах, например:

private StringBuffer tempValue = new StringBuffer();

startElement()
{
    tempValue.setLength(0); // clear buffer...
}

characters(characters(char[] ch, int start, int length)
{
    tempValue.append(ch, start, length); // append to buffer
}

endElement()
{
    String value = tempValue.toString(); // use characters in buffer...
}
person SanSentinel    schedule 18.03.2011
comment
Что определяет фрагменты, которые возвращает парсер? Мой файл содержит , и это, кажется, ограничивает синтаксический анализ. - person Lord Cat; 18.07.2016

  1. Я не думаю, что вы можете отключить разрешение объектов.

  2. Метод символов можно вызывать несколько раз для одного тега, и вам нужно собирать символы по нескольким вызовам, а не ожидать, что они все прибудут одновременно.

person Don Roby    schedule 29.12.2010
comment
хорошо, но почему метод символов вызывается несколько раз только для текстовых узлов, содержащих сущности? - person user278064; 29.12.2010
comment
Я не верю, что это единственное, что вызовет несколько вызовов, но я знаю, что это происходит в большинстве реализаций саксофона. Длинные блоки также могут быть разделены. - person Don Roby; 29.12.2010