gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:14:39 25 4
gpt4 key购买 nike

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

谢谢,

韦恩。

最佳答案

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

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

关于java - 如何使用 Java 将内部 dtd 插入到 xml 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6758281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com