2011-07-20 34 views
3

如何插入一個內部DTD到使用Java我要如何插入一個內部DTD到使用Java

一個XML文件的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是不被outputed。 我該如何解決這個問題?

作爲第二個問題,我該如何阻止實體的轉換。即我希望輸出文件包含TEMPLATE- &foo;而不是TEMPLATE-bar。

謝謝,

韋恩。

回答

0

我可以在輸出DTD實體聲明,但還沒有制定出如何保護實體本身:

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