直接就是一个代码实例,可直接运行看效果,注释也标注的差不多了
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>";
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);
}
}