2016-11-15 65 views
0

我要讀和xml文件,做一些修改,並把它複製到另一個位置。我還必須保留德文特殊字符,並將空標籤保持原樣(防止它們成爲自閉標籤)。爲了防止自動關閉標籤,我使用的Xerces庫,如鏈接: preventing empty xml elements are converted to self closing elements處理XML文件(JAVA)

在我的應用程序,如果我在XML的變化被忽略,代碼如下:

public static void main(String args[]) throws Exception { 
    InputStream inputStream= new FileInputStream(new File("D:\\qwe.xml")); 
    Reader reader = new InputStreamReader(inputStream,"ISO-8859-1"); 
    InputSource is = new InputSource(reader); 
    is.setEncoding("ISO-8859-1"); 

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder; 
    dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(is); 
    doc.setXmlStandalone(true); 

    File file = new File ("D:\\qwerty.xml"); 
    XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new FileOutputStream(file)); 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1") ; 
    transformer.transform(new DOMSource(doc), new StAXResult(writer)); 

}

在源文件中的第一行是

<?xml version="1.0" encoding="UTF-8"?> 

的問題是在目標文件,qwerty.xml,其中編碼=「UTF-8」是REM Oved的。在源文件中,儘管編碼是UTF-8,但由於德文字符,我必須將其設置爲「ISO-8859-1」。我想保留第一行作爲原件,保留空標籤(不是自閉標籤),並保留德文字符。我的代碼成功地只做第二和第三件事。

回答

0

呼叫

Transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); 

沒有影響,除非該變壓器是產生序列化的輸出。

在你的情況,因爲您要發送的輸出到StAXResult變壓器不產生串行化輸出。我不知道爲什麼你正在使用的XmlStreamWriter產生輸出,但如果你想這樣做的話,那就是對編碼,而不是變壓器決定XmlStreamWriter。

我還以爲它是簡單的變壓器輸出發送到構造StreamResult。

+0

XmlStreamWriter是我發現,保持空標籤,因爲它們是(我不想在自動關閉的標籤轉換它們)的唯一途徑。這是我使用它的唯一原因。 –

+0

好吧,如果你想讓XmlStreamWriter進行序列化,那麼你必須告訴它使用什麼編碼。 (你有沒有說爲什麼你不想自動關閉的標籤。如果接收應用程序無法處理他們,那麼你的整個系統是非常脆弱的。重寫它使用符合的XML解析器,而不是試圖迎合其弱點。) –