【问题标题】:How do I insert an internal dtd into an xml file using Java如何使用 Java 将内部 dtd 插入 xml 文件
【发布时间】:2011-10-09 03:40:41
【问题描述】:

如何使用 Java 将内部 dtd 插入到 xml 文件中

我有以下测试代码,它将 XML 文件读入 DOM 文档,然后再次将其写出。我希望输出文件最终与输入文件相同。

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;而不是模板栏。

谢谢,

韦恩。

【问题讨论】:

    标签: java xml dtd


    【解决方案1】:

    这里可能介绍了将 String 转换为 DOM 和反之亦然的简单方法:

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

    【讨论】:

    • 不鼓励将答案作为链接提供,因为链接可能已损坏(在您的实例中是这样)。
    【解决方案2】:

    我可以在输出中获得 DTD 实体声明,但还没有弄清楚如何保存实体本身:

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

    【讨论】:

      猜你喜欢
      • 2016-10-15
      • 2020-06-18
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多