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