??????? 八月已过半,凉秋也到了,但七月的故事还得继续讲、继续想、继续反思。我们不能否认历史,纵然历史是空白或者黑暗肮脏的。
??????? XML文件到底有多重要,我仍然没有深刻的体会到,也许这需要到更多的实战中去,闻过了血腥才知道战争的可怕。
??????? 需要提前声明的是,JAVA对XML文件的操作有很多种方法,DOM树是最容易理解的一种,但是效率、实用性有待验证。
??????? 代码是冗长的,思路却很简单。封装、解析XML文件主要是用Document类,来获取一个DOM树,然后向树中添加或从树中获取节点。
??????? 测试代码如下。
package com.xml; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; 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.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * @author wkupaochuan * @time Aug 16, 2012 * @version V 1.0 */ public class Blog { public static void main(String agrs[]) { createXml(); parserXml(); } /*生成XML文档*/ public static void createXml() { //创建DOM树,Document 接口表示整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问 Document document; try { document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); //依次创建并添加节点元素 //根节点 Element root = document.createElement("employees"); document.appendChild(root); //节点 Element employee = document.createElement("employee"); //姓名 Element name = document.createElement("name"); name.appendChild(document.createTextNode("丁洪亮")); //年龄 Element age = document.createElement("age"); age.appendChild(document.createTextNode("20")); //员工添加属性 employee.appendChild(name); employee.appendChild(age); //添加员工 root.appendChild(employee); //创建DOM到文件转换器 Transformer tf = TransformerFactory.newInstance().newTransformer(); //转换源 DOMSource source = new DOMSource(document); //设定转换编码 tf.setOutputProperty(OutputKeys.ENCODING, "gb2312"); //添加换行空白(没有这句的话XML文件无换行)(添加这句话之后就相当于每次多插入了n + 1个空白节点),解析的时候可以看出来 //tf.setOutputProperty(OutputKeys.INDENT, "yes"); //设定输出流 PrintWriter pw = new PrintWriter(new FileOutputStream("E:\\1.xml")); //设定转换目标 StreamResult result = new StreamResult(pw); //转换 tf.transform(source, result); } catch (ParserConfigurationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerFactoryConfigurationError e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //生成XML文件 /*解析XML文档*/ public static void parserXml() { //DOM树,从某个XML文件获取 Document document; try { document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("E:\\1.xml"); //获取DOM树中的所有节点 NodeList root = document.getChildNodes(); //循环获得每个员工节点 for(int i = 0; i < root.getLength(); ++i) { Node employees = root.item(i); NodeList employees1 = employees.getChildNodes(); for(int j = 0; j < employees1.getLength(); ++j) { Node employee = employees1.item(j); NodeList properties = employee.getChildNodes(); for(int k = 0; k < properties.getLength(); ++k) { Node property = properties.item(k); System.out.println("k=" + k + "---" + property.getNodeName() + ":" + property.getTextContent()); } } } } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
上述代码运行结果如下。
生成的XML文件结构
解析结果
??????? 很容易发现,解析结果还可以令人满意,但是生成的XML文件没有换行,很难读。这是因为代码中的注释中说到的设置输出属性时,设置了不自动插入空白。