加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

最原始的方式实现String与xml的转换

发布时间:2020-12-16 05:14:32 所属栏目:百科 来源:网络整理
导读:直接就是一个代码实例,可直接运行看效果,注释也标注的差不多了 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.parse

直接就是一个代码实例,可直接运行看效果,注释也标注的差不多了


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);
	}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读