В настоящее время я анализирую документы 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>€</p>
Мой анализатор создает текстовый узел для этого содержимого, содержащий «€» вместо «€».Это означает, что она разрешает сущность так, как она должна это делать (XHTML 1.0 Strict DTD ссылается на ENTITIES Latin1 DTD, что, в свою очередь, устанавливает эквивалентность "€" и "€").
Проблема в том, что я не хочу, чтобы парсер делал это. Я бы хотел оставить текст "€" без изменений .
Я уже пробовал:
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
Но:
Мне это не нравится, потому что я боюсь, что это может привести к тому, что некоторые реализации синтаксического анализатора не перейдут от XHTML 1.0 Strict DTD к ENTITIES Latin1 DTD и поэтому не будут считать "€" объявленная сущность.
Когда я это делаю, странным образом создаются два узла: узел сущности "фунт" и узел текста с символом "€" после него.
Есть идеи? Можно ли настроить это в DOM Parser, не прибегая к предварительной обработке XHTML и замене всех символов "&" начто-то другое? ...
Решения могут быть для парсера DOM или также для SAX, я не возражаю против парсинга SAX, а затем создаю свой DOM с помощью преобразования ...
Кроме того, я не могу переключиться на нестандартный XML-разбор библиотеки.Нет jdom, нет jsoup, нет HtmlCleaner и т. Д.
Большое спасибо.