[英]How to generate xml file with an existing dtd for sample of data using Java
[英]How do I insert an internal dtd into an xml file using Java
如何使用 Java 將內部 dtd 插入 xml 文件
我有以下測試代碼,它將 XML 文件讀入 DOM 文檔,然后再次將其寫出。 我希望 output 文件最終與輸入文件相同。
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>
output:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE root PUBLIC "NONE" "none.dtd">
<root id="TEMPLATE" xreflabel="TEMPLATE-bar">
</root>
如您所見,沒有輸出 dtd 以及實體信息。 我該如何解決?
作為次要問題,我如何停止實體的轉換。 即我希望 output 文件包含 TEMPLATE-&foo; 而不是模板欄。
謝謝,
韋恩。
我可以在 output 中獲得 DTD 實體聲明,但還沒有弄清楚如何保存實體本身:
DOMImplementationLS domImplementation = (DOMImplementationLS) DOMImplementationRegistry
.newInstance().getDOMImplementation("LS");
LSSerializer lsSerializer = domImplementation.createLSSerializer();
System.out.println(lsSerializer.writeToString(document));
將 String 轉換為 DOM 以及反之亦然的簡單方法可能會出現在這里:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.