您的位置:首页 > 编程语言 > Java开发

java 基础的String转XML

2016-09-07 14:28 176 查看
package XmlOrString;  

  

  

import java.io.ByteArrayOutputStream;  

import java.io.File;  

import java.io.FileWriter;  

import java.io.IOException;  

import java.io.StringReader;  

import javax.xml.parsers.DocumentBuilder;  

import javax.xml.parsers.DocumentBuilderFactory;  

import javax.xml.parsers.ParserConfigurationException;  

import javax.xml.transform.OutputKeys;  

import javax.xml.transform.Transformer;  

import javax.xml.transform.TransformerConfigurationException;  

import javax.xml.transform.TransformerException;  

import javax.xml.transform.TransformerFactory;  

import javax.xml.transform.dom.DOMSource;  

import javax.xml.transform.stream.StreamResult;  

import org.w3c.dom.Document;  

import org.xml.sax.InputSource;  

import org.xml.sax.SAXException;  

/** 

 *  

 * @author HaiCheng 

 * @version 1.0.0 

 * @time  2013-11-06 17:21:00 

 * 实现刷String字符串与xml之间的相互转换 使用最原始的javax.xml.parsers  标准的jdk api方式    

 */  

public class Begin {  

    public static void main(String[] args) throws SAXException,   

    IOException, ParserConfigurationException, TransformerException {  

          

       /* String xmlStr = "<?xml version='1.0' encoding='UTF-8' standalone='no'?>  " +  

                        "<world >         " +  

                        "   <person id='cheng' Type='china'>        " +  

                        "       <name>曹海成</name>  " +  

                        "       <age>23</age>  " +  

                        "       <sex>男</sex>  " +  

                        "   </person>       " +  

                        "   <person id='yang' Type='china'>     " +      

                        "       <name>曹海洋</name>  " +  

                        "       <age>18</age>  " +  

                        "       <sex>女</sex>  " +  

                        "   </person>   " +  

                        "   <person id='long' Type='china'>   " +       

                        "       <name>曹海龙</name>  " +  

                        "       <age>13</age>  " +  

                        "       <sex>男</sex>  " +  

                        "   </person>         " +  

                        "</world>";
 */

                StringBuffer condition = new StringBuffer();
condition.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
.append("<personList>")
.append("<name>"+userIds+"</name>").append("<age>25</age>")
.append("<name>"+userIds+"</name>").append("<age>26</age>")
.append("<name>"+userIds+"</name>").append("<age>27</age>")
.append("</personList>");
String xmlStr = condition.toString();

        StringReader sr = new StringReader(xmlStr);//得到一个字符流  

        /* 

         * 查阅JAVA API得到如下资料: 

         *      SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入。如果有字符流可用,则解析器将直接读取该流, 

         *      而忽略该流中找到的任何文本编码声明。 

         *      如果没有字符流,但却有字节流,则解析器将使用该字节流,从而使用在 InputSource 中指定的编码, 

         *      或者另外(如果未指定编码)通过使用某种诸如 XML 规范 中的算法算法自动探测字符编码。 

         *      如果既没有字符流,又没有字节流可用,则解析器将尝试打开到由系统标识符标识的资源的 URI 连接。 

         *  

         * 以下是InputSource类的四种构造方法 

         * 1、public InputSource()零参数默认构造方法。  

         * 2、public InputSource(InputStream byteStream)使用字节流创建新的输入源 

         * 3、InputSource(Reader characterStream) 使用字符流创建新的输入源。 

         * 4、InputSource(String systemId) 使用系统标识符创建新的输入源。 

         */  

        InputSource is = new InputSource(sr);//获取xml输入源  

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//获取 DocumentBuilderFactory 的新实例。此 static 方法创建一个DOM解析器工厂实例  

        DocumentBuilder builder=factory.newDocumentBuilder();//获得具体的DOM解析器  

        /* 

         * //将给定输入源的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。 

         * 如果 InputSource 为 null,则抛出一个 IllegalArgumentException。  

         */  

        Document doc = builder.parse(is);  

          

        /*--------------以上内容已经将String转换成了Document对象,下面的内容是将该对象写成xml文件--------------*/  

          

        TransformerFactory tFactory = TransformerFactory.newInstance();//获取 TransformerFactory 的新实例。此静态方法创建新的工厂实例。  

        Transformer transformer = tFactory.newTransformer();  

        /** 编码 */  

        // transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312");  

        DOMSource source = new DOMSource(doc);  

          

        StreamResult result = new StreamResult(new File("haicheng.xml"));  

        transformer.transform(source, result);  

          

        /*--------------然后下面就是再将它们转换成字符串啦----------------*/  

          

        TransformerFactory   tf   =   TransformerFactory.newInstance();  

        Transformer t = tf.newTransformer();  

        t.setOutputProperty("encoding","GBK");//不明白为什么一定要gbk编码  

          

        /* 

         * ByteArrayOutputStream类 api介绍 

         *此类实现了一个输出流,其中的数据被写入一个字节数组。 

         *缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 检索数据。 

         * 该类有两个构造方法: 

         * 1、public ByteArrayOutputStream()  创建一个新的字节数组输出流,缓冲区的最初容量是32个字节,缓冲区可随着数据的不断写入自动增大 

         * 2、public ByteArrayOutputStream(int size)  跟上一个的区别是这个指定了缓冲区的大小(字节为单位)  如果传参为负值 抛出IllegalArgumentException 

         */  

        ByteArrayOutputStream   bos   =   new   ByteArrayOutputStream();  

        t.transform(new DOMSource(doc), new StreamResult(bos));  

        String xmlStr1 = bos.toString();  

        System.out.println("xmlStr1:");  

        System.out.println(xmlStr1);  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: