2016-11-15 62 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解析器,而不是试图迎合其弱点。) –