Разбор Java XML: Избегайте разрешения ссылок на сущности - PullRequest
2 голосов
/ 30 августа 2011

В настоящее время я анализирую документы XHTML с помощью анализатора DOM, например:

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);

final DocumentBuilder db = dbf.newDocumentBuilder();
db.setEntityResolver(MY_ENTITY_RESOLVER);
db.setErrorHandler(MY_ERROR_HANDLER);
...
final Document doc = db.parse(inputSource);

И моя проблема заключается в том, что, когда мой документ содержит ссылку на сущность, например:

<p>&euro;</p>

Мой анализатор создает текстовый узел для этого содержимого, содержащий «€» вместо «€».Это означает, что она разрешает сущность так, как она должна это делать (XHTML 1.0 Strict DTD ссылается на ENTITIES Latin1 DTD, что, в свою очередь, устанавливает эквивалентность "€" и "€").

Проблема в том, что я не хочу, чтобы парсер делал это. Я бы хотел оставить текст "€" без изменений .

Я уже пробовал:

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

Но:

  1. Мне это не нравится, потому что я боюсь, что это может привести к тому, что некоторые реализации синтаксического анализатора не перейдут от XHTML 1.0 Strict DTD к ENTITIES Latin1 DTD и поэтому не будут считать "€" объявленная сущность.

  2. Когда я это делаю, странным образом создаются два узла: узел сущности "фунт" и узел текста с символом "€" после него.

Есть идеи? Можно ли настроить это в DOM Parser, не прибегая к предварительной обработке XHTML и замене всех символов "&" начто-то другое? ...

Решения могут быть для парсера DOM или также для SAX, я не возражаю против парсинга SAX, а затем создаю свой DOM с помощью преобразования ...

Кроме того, я не могу переключиться на нестандартный XML-разбор библиотеки.Нет jdom, нет jsoup, нет HtmlCleaner и т. Д.

Большое спасибо.

1 Ответ

2 голосов
/ 11 октября 2011

Подход, который я выбрал, состоял в том, чтобы заменить любые объекты уникальным маркером, который Xerces рассматривает как обычный текст.После преобразования в объект Document маркеры заменяются объектами Entity Reference.

См. Функцию convertStringToDocument () в http://sourceforge.net/p/commonclasses/code/14/tree/trunk/src/com/redhat/ecs/commonutils/XMLUtilities.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...