XML转换和换行符

时间:2014-02-12 14:55:39

标签: java xml

好的,我的代码适用于这个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或其他文本编辑器中正确呈现,包括此文件)

,如果这种方式有些不正常,请告诉我。

3 个答案:

答案 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时,不一定使用正确的编码来存储文件。