好的,我的代码适用于这个xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<record-table>
<record>
<record_id>1</record_id>
<record_rows>
<record_row>abcdef</record_row>
</record_rows>
</record>
<record>
<record_id>2</record_id>
<record_rows>
<record_row>abcdef</record_row>
<record_row>abcdef</record_row>
</record_rows>
</record>
</record-table>
代码将初始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或其他文本编辑器中正确呈现,包括此文件)
,如果这种方式有些不正常,请告诉我。
答案 0 :(得分:2)
从
更改代码writer.writeCharacters("\r\n");
到
write.writeCharacters(System.getProperty("line.separator"));
这是更通用的,应该更好
比\r\n
仅适用于Windows。
答案 1 :(得分:1)
您需要将这两个属性添加到变换器中。如果你实际上不希望它缩进,你可以省略第二个;它只是将每个open-tag放在一个没有缩进的新行上。
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
这是你在找什么?这是一个完整的代码块,它将在第一行格式化XML并将其打印到第二行中指定的文件。在我的Windows 7机器上,Notepad打开它就可以了,并识别换行符等。
Reader in = new StringReader("<a><b>Hello</b><c><d>World</d></c></a>");
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));
答案 2 :(得分:0)
最好修改文件中的编码。
FileOutputStream XmlOutputStream = new FileOutputStream(...);
Writer XmlWriterUtf8 = new OutputStreamWriter(XmlOutputStream, "UTF8");
XmlWriterUtf8.write(XmlBuffer.toString());
XmlWriterUtf8.close();
使用Windows时,不一定使用正确的编码来存储文件。