XML转换和换行符 [英] XML transform and linebreak characters

查看:303
本文介绍了XML转换和换行符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,我的代码适用于这个xml:

ok, i have code which works on this 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个文件,然后尝试添加一些标记。

The code splits initial XML file into 2 files, and also tries to add some tags afterwards.

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),记事本会认出它们。你能解释一下它为什么会发生这种情况吗?

The problem is that when i open resulting files in notepad, notepad doesn't recognize linebreak characters. (probably because they are "/n", not "/n/r") At the same time if i transformed StaxSource into StreamResult (not employing XMLStreamWriter) notepad would recognize them. Can you explain why it happens, and, how to make it well-formated?

(但正如你所理解的那样,它是在wordPad或其他文本中正确呈现的编辑包括这一个)

(but as you understand it IS presented properly in wordPad or other text Editors including this one)

同样,如果这种方式有所不同,请告诉我。

Also, if this way is perverse in some way, please, let me know.

推荐答案

更改代码

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

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

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

This is more generic and should work better than \r\n which would only work on windows.

这篇关于XML转换和换行符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆