Как вставить внутренний dtd в XML-файл, используя Java - PullRequest
3 голосов
/ 20 июля 2011

Как вставить внутренний dtd в XML-файл, используя Java

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

public class DomToXml {
Document document;

void process() {
    document = parseXmlFile("dat/input.xml");
    writeXmlFile(document, "dat/output.xml");
}

void writeXmlFile(Document document, String fileName) {
    try {
        Source source = new DOMSource(document);
        File file = new File(fileName);
        Result result = new StreamResult(file);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
        transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
        DocumentType documentType = document.getDoctype();
        if (documentType != null) {
            transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, documentType.getSystemId());
            transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, documentType.getPublicId());
        }
        transformer.transform(source, result);
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(-1);
    }
}

Document parseXmlFile(String filename) {
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    documentBuilderFactory.setNamespaceAware(true);
    documentBuilderFactory.setXIncludeAware(true);
    documentBuilderFactory.setExpandEntityReferences(true);
    documentBuilderFactory.setValidating(false);
    DocumentBuilder documentBuilder;
    try {
        documentBuilder = documentBuilderFactory.newDocumentBuilder();
        documentBuilder.setErrorHandler(new MyErrorHandler());
        documentBuilder.setEntityResolver(new MyEntityResolver());
        return documentBuilder.parse("file:" + filename);
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(-1);
    }
    return null;
}

public static void main(String[] args) {
    DomToXml a = new DomToXml();
    a.process();
    System.out.println("Done!");
}

}

Входной файл:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE root PUBLIC "NONE"
  "none.dtd" [
  <!ENTITY foo "bar">
]>
<root id="TEMPLATE" xreflabel="TEMPLATE-&foo;">
</root>

Выход:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE root PUBLIC "NONE" "none.dtd">
<root id="TEMPLATE" xreflabel="TEMPLATE-bar">
</root>

Как вы можете видеть, dtd вместе с информацией о сущности не выдвигается. Как мне это исправить?

В качестве вторичного вопроса, как мне остановить трансформацию сущности. я хочу, чтобы выходной файл содержал TEMPLATE- & foo; а не ШАБЛОН-бар.

Спасибо

Wayne.

Ответы [ 2 ]

0 голосов
/ 23 мая 2012

Простой способ преобразования String в DOM и наоборот, вероятно, представлен здесь:

http://famulatus.com/ks/programming/java/item/335-convert-xml-dom-to-string-and-string-to-xml-dom.html

0 голосов
/ 30 июля 2011

Я могу получить объявление сущности DTD в выходных данных, но не выяснил, как сохранить саму сущность:

DOMImplementationLS domImplementation = (DOMImplementationLS) DOMImplementationRegistry
    .newInstance().getDOMImplementation("LS");
LSSerializer lsSerializer = domImplementation.createLSSerializer();
System.out.println(lsSerializer.writeToString(document));
...