SAX Parser: укажите местоположение DTD в апплете

У меня есть апплет, который отлично работает в средстве просмотра апплетов, но после его воспроизведения на сервере он не может анализировать XML-файлы.

причина проста: синтаксический анализатор SAX пытается открыть dtd на жестком диске, а не в JAR.

Мне сказали сделать так:

URL-адреса ресурсов можно легко сформировать с помощью конструктора URL(baseURL, pathString), где базовый URL-адрес получается из Applet.getDocumentBase() или Applet.getCodeBase().

но я не знаю, как применить это в моем случае:

вот образец XML:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "leveldtd.dtd">   
<level>
...
</level>

а вот инициализация моего парсера

public static void parseThis(InputSource is) throws Exception{
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLHandlerLevel myExampleHandler = new XMLHandlerLevel();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(myExampleHandler);
        /* Begin parsing */ 
        xr.parse(is);
    }

Любые идеи ?

Джейсон


person Jason Rogers    schedule 23.06.2011    source источник
comment
Вероятно, это просто опечатка, не имеющая отношения к вашему вопросу, но в вашем XML-образце есть тип документа примечания (<!DOCTYPE note), а корневым элементом является level.   -  person Daniel Haley    schedule 23.06.2011
comment
в чем проблема с этим? (мой xml — это что-то полностью настроенное, что я использую для хранения своих игровых уровней, не соблюдайте конкретную норму, dtd просто для того, чтобы убедиться, что данные правильно сформированы)   -  person Jason Rogers    schedule 24.06.2011
comment
Имя в типе документа должно совпадать с корневым элементом, иначе оно недействительно. Я не уверен, как вы можете проверить свой XML на соответствие вашему DTD и не получить ошибок. Это из w3.org/TR/xml/#sec-prolog-dtd: Validity constraint: Root Element Type - The Name in the document type declaration MUST match the element type of the root element.   -  person Daniel Haley    schedule 24.06.2011


Ответы (1)


Если проверка не требуется, вы можете просто отключить ее в SAXParserFactory.setValidating(), чтобы синтаксический анализатор не пытался читать DTD.

Однако, если вам нужна проверка, вы можете перенаправить любые запросы DTD/XSD, установив свой собственный EntityResolver в парсере sax.

person Karl-Bjørnar Øie    schedule 23.06.2011
comment
это вариант, который я обдумываю, поскольку все xml сформированы правильно, я бы предпочел выяснить, как установить проверку ^^ - person Jason Rogers; 23.06.2011