2008-11-21 1 views
2

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

ответ

4

Вы должны иметь возможность реализовать пользовательский 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; 
    } 
    } 

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

См. Метод setXMLResolver.

+0

Настройка выполняется только при использовании древесного дерева. Я пытался использовать поставщика солнца. – 2008-11-21 19:32:10

1

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

Смежные вопросы