используйте EntityResolver, который привел бы к «нулевому» DTD - который определил расширение «wiki» как «& wiki;». Кажется, должен быть лучший способ!
у Java-приложение для постобработки XML-файлов. Эти xml-файлы взяты из RDF-экспорта Semantic Mediawiki, поэтому они имеют синтаксис rdf / xml.
Моя проблема заключается в следующем: когда я читаю xml-файл, все сущности в файле преобразуются в их значение, указанное в Doctype. Например в Doctype у меня есть
<!DOCTYPE rdf:RDF[
<!ENTITY wiki 'http://example.org/smartgrid/index.php/Special:URIResolver/'>
..
]>
и в корневом элементе
<rdf:RDF
xmlns:wiki="&wiki;"
..
>
Это означает
<swivt:Subject rdf:about="&wiki;Main_Page">
становится
<swivt:Subject rdf:about="http://example.org/smartgrid/index.php/Special:URIResolver/Main_Page">
Я пытался использовать JDOM и стандартную Java DOM. Код, который я думаю, уместен здесь для стандартного DOM:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setExpandEntityReferences(false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
и для JDOM
SAXBuilder builder = new SAXBuilder();
builder.setExpandEntities(false); //Retain Entities
builder.setValidation(false);
builder.setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);
Но сущности разрешаются во всем XML-документе, тем не менее. Я что-то пропустил? Часы поиска привели меня только к командам «ExpandEntities», но, похоже, они не работают.
Любая подсказка высоко ценится :)