XML转换和换行符

好吧,我有代码可以在这个xml上运行:

   1  abcdef    2  abcdef abcdef    

代码将初始XML文件拆分为2个文件,然后尝试添加一些标记。

 import java.io.*; import java.io.FileReader; import java.io.FileWriter; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stax.StAXResult; import javax.xml.transform.stream.StreamResult; import javax.xml.stream.XMLStreamException; import java.io.FileOutputStream; import javax.xml.transform.OutputKeys; public class ver2 { public static void main(String[] args) throws Exception { XMLInputFactory xif = XMLInputFactory.newInstance(); xif.setProperty("javax.xml.stream.isCoalescing", true); XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("out.xml")); XMLOutputFactory factory = XMLOutputFactory.newInstance(); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); xsr.nextTag(); int i=0; while(xsr.hasNext()) { int event = xsr.next(); if (event== XMLStreamConstants.START_ELEMENT){ if (xsr.getLocalName().equals("record")){ i++; File file = new File(i + ".txt"); try { XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter(file)); t.transform(new StAXSource(xsr), new StAXResult(writer)); writer.writeStartElement("addSomeTags"); writer.writeCharacters("\r\n"); writer.writeStartElement("somestuff"); writer.writeEndElement(); writer.writeEndElement(); writer.flush(); writer.close(); } catch (XMLStreamException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } } } 

问题是,当我在记事本中打开生成的文件时,记事本无法识别换行符。 (可能是因为它们是“/ n”,而不是“/ n / r”)同时如果我将StaxSource转换为StreamResult(不使用XMLStreamWriter),记事本会认出它们。 你能解释一下它为什么会发生,以及如何使其格式良好?

(但正如您所理解的那样,它在wordPad或其他文本编辑器中正确呈现,包括此编辑器)

另外 ,如果这种方式在某种程度上有悖常理,请告诉我。

更改代码

 writer.writeCharacters("\r\n"); 

 write.writeCharacters(System.getProperty("line.separator")); 

这是更通用的,应该比\r\n更好地工作,它只适用于Windows。

您需要将这两个属性添加到变换器中。 如果你实际上不希望它缩进,你可以省略第二个; 它只是将每个open-tag放在一个没有缩进的新行上。

  t.setOutputProperty(OutputKeys.INDENT, "yes"); t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 

这是你在寻找什么? 这是一个完整的代码块,它将格式化第一行中的XML并将其打印到第二行中指定的文件。 在我的Windows 7机器上,记事本打开它就可以了,并识别换行符等。

  Reader in = new StringReader("HelloWorld"); Writer out = new FileWriter("C:\\Temp\\test.xml"); XMLInputFactory xif = XMLInputFactory.newInstance(); xif.setProperty("javax.xml.stream.isCoalescing", true); XMLStreamReader xin = xif.createXMLStreamReader(in); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); t.setOutputProperty(OutputKeys.INDENT, "yes"); t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); t.transform(new StAXSource(xin), new StreamResult(out)); 

您可能更好地修改文件中的编码。

 FileOutputStream XmlOutputStream = new FileOutputStream(...); Writer XmlWriterUtf8 = new OutputStreamWriter(XmlOutputStream, "UTF8"); XmlWriterUtf8.write(XmlBuffer.toString()); XmlWriterUtf8.close(); 

使用Windows时,不一定使用正确的编码来存储文件。