Как остановить встроенный синтаксический анализатор StAX Sun JDK1.6 от разрешения сущностей DTD - PullRequest
2 голосов
/ 21 ноября 2008

Я использую API на основе событий StAX для изменения потока XML. Поток представляет собой HTML-документ с объявлением DTD. Я хотел бы скопировать эту декларацию DTD в выходной документ (написанный с использованием XMLEventWriter). Когда я прошу фабрику игнорировать DTD, она не загрузит DTD, а удалит весь оператор и оставит только строку "<!DOCUMENTTYPE". Если не игнорировать, весь DTD загружается и включается при дословном выводе события DTD. Я не хочу использовать время для загрузки этого DTD, но включаю полную спецификацию DTD (разрешение сущностей уже отключено, и мне это не нужно). Кто-нибудь знает, как отключить выборку внешних DTD.

Ответы [ 2 ]

4 голосов
/ 21 ноября 2008

Вы должны иметь возможность реализовать пользовательский XMLResolver, который перенаправляет попытки извлечения внешних DTD в локальный ресурс (если ваш код анализирует только определенный тип документа, это часто является ресурсом класса прямо в JAR).

class CustomResolver implements javax.xml.stream.XMLResolver {

  public Object resolveEntity(String publicID,
                              String systemID,
                              String baseURI,
                              String namespace)
                  throws XMLStreamException 
  {
    if ("The public ID you expect".equals(publicID)) {
      return getClass().getResourceAsStream("doc.dtd");
    } else {
      return null;
    }
  }

Обратите внимание, что некоторые документы содержат только "systemID", поэтому вам следует вернуться к проверке этого. Проблема с системным идентификатором заключается в том, что это должен быть «системный» URL-адрес, а не хорошо известный стабильный URI. На практике это часто используется, как если бы это был URI.

См. Метод setXMLResolver .

1 голос
/ 27 января 2009

Также: ваш оригинальный подход (установка SUPPORT_DTD в false) может работать с Woodstox, если до сих пор вы использовали стандартный анализатор Sun stax в комплекте с JDK 1.6.

...