Java操作XML文件(写)
2015-09-12 18:03
615 查看
一 概述
同XML文件的读取一样,生成或写入XML文件也有四种方式,分别为DOM,SAX,DOM4J和JDOM,其中前两种为官方,后两种第三方API,需要相应jar包,其它详见Java操作XML文件(读)这篇文章,这里不是累述。二 DOM方式生成
DOM方式的生成是基于树(tree)结构,首先生成树(root)节点,生成的DOM树会驻留在内存中,这样优点是方便随时增删改,所以如果XML需要频繁的修改,推荐这种方式。具体代码如下:package com.jamie.writer; import java.io.File; 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.w3c.dom.Element; public class DomWriter { public static void main(String[] args) { // 创建一个DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 创建DocumentBuilder对象 try { DocumentBuilder db = dbf.newDocumentBuilder(); // 获得一个Document对象,写入xml结构 Document document = db.newDocument(); // 去掉standalone属性 document.setXmlStandalone(true); // 创建一个根节点 Element classElement = document.createElement("class"); // 生产根节点下的子节点,并添加属性 Element personElement = document.createElement("person"); personElement.setAttribute("id", "1"); // 添加name 标签,并赋值 Element nameElement = document.createElement("name"); nameElement.setTextContent("小明"); personElement.appendChild(nameElement); // 将子节点person添加到根节点class classElement.appendChild(personElement); // 将根节点添加到document,生产一个dom树 document.appendChild(classElement); // 创建xml文件,需要一个TransformerFactory对象 TransformerFactory tff = TransformerFactory.newInstance(); try { // 创建一个Transformer对象 Transformer tf = tff.newTransformer(); tf.setOutputProperty(OutputKeys.INDENT, "yes"); tf.transform(new DOMSource(document), new StreamResult( new File("clsss.xml"))); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TransformerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParserConfigurationException e) { e.printStackTrace(); } } }
三 SAX方式生成
SAX方式生成XML是基于事件模型的,当把某一标签走完后,不能走回头路,因为它没有状态性可言,即无法返回修改某一完成的标签,但是SAX的效率很高。具体代码如下:package com.jamie.writer; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; public class SaxWrite { public static void main(String[] args) { // 创建一个SAXTransformerFactory SAXTransformerFactory stff = (SAXTransformerFactory) SAXTransformerFactory .newInstance(); try { // 获取TransformerHandler对象 TransformerHandler handler = stff.newTransformerHandler(); // 通过handler创建Transformers对象 Transformer former = handler.getTransformer(); // 通过Transformer对象对生成的xml文件进行设置 former.setOutputProperty(OutputKeys.INDENT, "yes"); former.setOutputProperty(OutputKeys.ENCODING, "utf-8"); // 创建一个result对象,用于进行文件的创建和文件输出流的编写,并使其与handler对象关联 File f = new File("sax.xml"); if (!f.exists()) { f.createNewFile(); } Result rs = new StreamResult(new FileOutputStream(f)); handler.setResult(rs); // 利用handler对象进行xml内容的编写 // 打开doument handler.startDocument(); // 创建Attribute对象,用户重复利用 AttributesImpl attrs = new AttributesImpl(); handler.startElement("", "", "class", attrs); attrs.clear(); attrs.addAttribute("", "", "id", "", "1"); // 创建person标签 handler.startElement("", "", "person", attrs); attrs.clear(); // 创建name标签 handler.startElement("", "", "name", attrs); String name = "小明"; handler.characters(name.toCharArray(), 0, name.length()); handler.endElement("", "", "name"); handler.endElement("", "", "person"); handler.endElement("", "", "class"); // 关闭document handler.endDocument(); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
四 DOM4J方式生成
DOM4J是基于底层API(也就是官方的提供的方式,DOM和SAX)的一种生成方式,效率一般来说仅次于SAX,并且在功能和使用的便捷方面都很强大,所以也是现实开发中比较常用的一种方式。具体代码如下,别忘了引入相应的jar:package com.jamie.writer; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.dom4j.*; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class Dom4jWriter { public static void main(String[] args) { // 调用生成方法 Dom4jWriter dom4j = new Dom4jWriter(); dom4j.createXml(); } /** * 生成方法 */ public void createXml() { // 使用DocumentHelper创建Document对象,即整个xml文档 Document document = DocumentHelper.createDocument(); // 创建根节点class 及相应的节点,注意addElement方法的依属关系 Element classEle = document.addElement("class"); Element personEle = classEle.addElement("person"); Element nameEle = personEle.addElement("name"); personEle.addAttribute("id", "1"); nameEle.setText("小明"); // 设置生成xml内容的格式,换行 OutputFormat of = OutputFormat.createPrettyPrint(); System.out.println(document.asXML()); // 设置编码 of.setEncoding("UTF-8"); File fileWriter; try { // 创建文件 fileWriter = new File("dom4j.xml"); // dom4j提供的专门的文件写入对象XMLWriter XMLWriter xmlWriter = new XMLWriter( new FileOutputStream(fileWriter), of); xmlWriter.write(document); xmlWriter.flush(); xmlWriter.close(); } catch (IOException e) { e.printStackTrace(); } } }
五 JDOM方式生成
与DOM4J类似JDOM也是一种第三方的基于底层API方式的一种操作XML文件的工具,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。与其它方式相比,它使用起来更便捷,但是效率较低,建议在小文档情况下使用。代码如下:package com.jamie.writer; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; public class JdomWriter { public static void main(String[] args) { JdomWriter jd = new JdomWriter(); jd.createXml(); } public void createXml() { // 创建根节点 Element root = new Element("class"); // 生成一个document对象 Document document = new Document(root); // 创建person节点 Element person = new Element("person"); person.setAttribute("id", "1"); root.addContent(person); // 创建nam节点 Element name = new Element("name"); name.setText("小明"); person.addContent(name); // 对xml进行排版格式化,两种方式 Format format = Format.getPrettyFormat(); /* * Format format =Format.getCompactFormat(); format.setIndent(""); */ // 创建XMLOutputter对象 XMLOutputter out = new XMLOutputter(format); // 使用XMLOutputter对象将Document对象转成xml文档 try { out.output(document, new FileOutputStream(new File("jdom.xml"))); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
六 总结
以上代码生成的xml文件内容都应该如下:<?xml version="1.0" encoding="UTF-8"?> <class> <person id="1"> <name>小明</name> </person> </class>
例子都比较简单,但是常用的涉及到了,几种方法中最常用的还是属于DOM4J的方式,现在很多框架中也使用这种方式。
以上代码都是自己一个个敲的,一是让自己加深学习印象,二是如果可以也给需要的人做一个参考。因为自己还在初级学习阶段,如果有问题,希望有心人指出,相互交流学习,谢谢!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树