Java生成xml文件的四种方式

Java生成xml文件的四种方式上一篇文章写了xml文件4种读取方式,本篇文章将简介使用四种方式对xml进行写入。

大家好,又见面了,我是你们的朋友全栈君。

绪论

上一篇文章写了xml文件4种读取方式,本篇文章将简介使用四种方式对xml进行写入。

一、Dom写入

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class DomXml { 

@Test
public void test(){ 

Long start = System.currentTimeMillis();
createXml();
System.out.println("运行时间:"+ (System.currentTimeMillis() - start));
}
/** * 生成xml方法 */
public static void createXml(){ 

try { 

// 创建解析器工厂 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.newDocument();
// 不显示standalone="no"
document.setXmlStandalone(true);
Element bookstore = document.createElement("bookstore");
// 向bookstore根节点中添加子节点book
Element book = document.createElement("book");
Element name = document.createElement("name");
// 不显示内容 name.setNodeValue("不好使");
name.setTextContent("雷神");
book.appendChild(name);
// 为book节点添加属性
book.setAttribute("id", "1");
// 将book节点添加到bookstore根节点中
bookstore.appendChild(book);
// 将bookstore节点(已包含book)添加到dom树中
document.appendChild(bookstore);
// 创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
// 创建 Transformer对象
Transformer tf = tff.newTransformer();
// 输出内容是否使用换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
// 创建xml文件并写入内容
tf.transform(new DOMSource(document), new StreamResult(new File("book1.xml")));
System.out.println("生成book1.xml成功");
} catch (Exception e) { 

e.printStackTrace();
System.out.println("生成book1.xml失败");
}		
}
}

生成结果:
这里写图片描述

二、Dom4j写入

import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
public class Dom4jXml { 

@Test
public void test(){ 

Long start = System.currentTimeMillis();
createXml();
System.out.println("运行时间:"+ (System.currentTimeMillis() - start));
}
/** * 生成xml方法 */
public static void createXml(){ 

try { 

// 1、创建document对象
Document document = DocumentHelper.createDocument();
// 2、创建根节点rss
Element rss = document.addElement("rss");
// 3、向rss节点添加version属性
rss.addAttribute("version", "2.0");
// 4、生成子节点及子节点内容
Element channel = rss.addElement("channel");
Element title = channel.addElement("title");
title.setText("国内最新新闻");
// 5、设置生成xml的格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式
format.setEncoding("UTF-8");
// 6、生成xml文件 
File file = new File("rss.xml");
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
// 设置是否转义,默认使用转义字符
writer.setEscapeText(false);
writer.write(document);
writer.close();
System.out.println("生成rss.xml成功");
} catch (Exception e) { 

e.printStackTrace();
System.out.println("生成rss.xml失败");
}
}
}

生成结果:
这里写图片描述

三、jDom写入

import java.io.File;
import java.io.FileOutputStream;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.junit.Test;
public class JDomXml { 

@Test
public void test(){ 

Long start = System.currentTimeMillis();
createXml();
System.out.println("运行时间:"+ (System.currentTimeMillis() - start));
}
/** * 生成xml方法 */
public static void createXml(){ 

try { 

// 1、生成一个根节点
Element rss = new Element("rss");
// 2、为节点添加属性
rss.setAttribute("version", "2.0");			
// 3、生成一个document对象
Document document = new Document(rss);
Element channel = new Element("channel");
rss.addContent(channel);
Element title = new Element("title");
title.setText("国内最新新闻");
channel.addContent(title);
Format format = Format.getCompactFormat();
// 设置换行Tab或空格
format.setIndent(" ");
format.setEncoding("UTF-8");
// 4、创建XMLOutputter的对象
XMLOutputter outputer = new XMLOutputter(format);
// 5、利用outputer将document转换成xml文档
File file = new File("rssNew.xml");
outputer.output(document, new FileOutputStream(file));
System.out.println("生成rssNew.xml成功");
} catch (Exception e) { 

System.out.println("生成rssNew.xml失败");
}
}
}

生成结果:
这里写图片描述

四、Sax写入

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.xml.sax.helpers.AttributesImpl;
public class SaxXml { 

@Test
public void test(){ 

List<Book> bList = new ArrayList<Book>();
Book b = new Book();
b.setName("冰与火之歌");
b.setAuthor("乔治马丁");
b.setId("1");
b.setLanguage("English");
b.setPrice("86");
b.setYear("2014");
bList.add(b);
Long start = System.currentTimeMillis();
createXml(bList);
System.out.println("运行时间:"+ (System.currentTimeMillis() - start));
}
// 生成xml
public static void createXml(List<Book> bList){ 
		
// 1、创建一个SAXTransformerFactory类的对象
SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
try { 

// 2、通过SAXTransformerFactory创建一个TransformerHandler的对象
TransformerHandler handler = tff.newTransformerHandler();
// 3、通过handler创建一个Transformer对象
Transformer tr = handler.getTransformer();
// 4、通过Transformer对象对生成的xml文件进行设置
// 设置编码方式
tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// 设置是否换行
tr.setOutputProperty(OutputKeys.INDENT, "yes");
// 5、创建一个Result对象
File f = new File("src/newbooks.xml");
// 判断文件是否存在
if(!f.exists()){ 

f.createNewFile();
}
Result result = new StreamResult(new FileOutputStream(f));
// 6、使RESULT与handler关联
handler.setResult(result);
// 打开document
handler.startDocument();
AttributesImpl attr = new AttributesImpl();			
handler.startElement("", "", "bookstore", attr);
attr.clear();
for (Book book : bList) { 

attr.clear();
attr.addAttribute("", "", "id", "", book.getId());
handler.startElement("", "", "book", attr);
// 创建name
attr.clear();
handler.startElement("", "", "name", attr);
handler.characters(book.getName().toCharArray(), 0, book.getName().length());
handler.endElement("", "", "name");
// 创建year
attr.clear();
handler.startElement("", "", "year", attr);
handler.characters(book.getYear().toCharArray(), 0, book.getYear().length());
handler.endElement("", "", "year");
// 创建author
if(book.getAuthor() != null && !"".equals(book.getAuthor().trim())){ 

attr.clear();
handler.startElement("", "", "author", attr);
handler.characters(book.getAuthor().toCharArray(), 0, book.getAuthor().length());
handler.endElement("", "", "author");
}
// 创建price
if(book.getPrice() != null && !"".equals(book.getPrice().trim())){ 

attr.clear();
handler.startElement("", "", "price", attr);
handler.characters(book.getPrice().toCharArray(), 0, book.getPrice().length());
handler.endElement("", "", "price");
}
// 创建language
if(book.getLanguage() != null && !"".equals(book.getLanguage().trim())){ 

attr.clear();
handler.startElement("", "", "language", attr);
handler.characters(book.getLanguage().toCharArray(), 0, book.getLanguage().length());
handler.endElement("", "", "language");
}
handler.endElement("", "", "book");
}
handler.endElement("", "", "bookstore");
// 关闭document
handler.endDocument();
System.out.println("生成newbooks.xml成功");
} catch (Exception e) { 

e.printStackTrace();
System.out.println("生成newbooks.xml失败");
}
}
}

生成结果:
这里写图片描述

五、其它

	/**
* 四种方式总结
* 
* dom基于tree,sax基于事件,JDOM和DOM4J基于底层API
* 
* dom生成的内容会保存到内存中,方便删除和修改
* sax不能修改已经生成的标签
* 
* 添加JUnit在Libraries选择Add Library中的JUnit即可
* 
*/

(若有什么错误,请留言指正,3Q)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162464.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Okhttp 之 okio

    Okhttp 之 okio本文是的前一篇文章OkhttpIO之Segment&amp;SegmentPool的基础上写的,如果你没看懂前面的文章,那么看本文会相当的吃力,因为很多关键的代码都是在前面这篇文章中剖析的。ByteStringokio中添加一个类ByteString,顾名思义就是字节串,这里做一个概要的讲解,具体的实现大家可以去看源码。既然是字节串,它内部就是用一个字节数组支持的。…

  • 查理德弗曼学习法

    查理德弗曼学习法费曼学习法的灵感源于诺贝尔物理奖获得者理查德·费曼(RichardFeynman),运用费曼技巧,你只需花上20分钟就能深入理解知识点,而且记忆深刻,难以遗忘。知识有两种类型,我们绝大多数人关注的都是错误的那类。第一类知识注重了解某个事物的名称。第二类知识注重了解某件事物。这可不是一回事儿。著名的诺贝尔物理学家理查德·费曼(RichardFeynman)能够理解这二者间的差别,这也是他成功最重要的原因之一。事实上,他创造了一种学习方法,确保他会比别人对事物了解的更透彻。费曼学习法可以简化为四个单词:C

  • js 截取字符串的三种方法「建议收藏」

    js 截取字符串的三种方法「建议收藏」方法1:substring()方法string.substring(from,to)方法从from位置截取到to位置,to可选,没有设置时默认到末尾。&lt;!DOCTYPEhtml&gt;&lt;html&gt;&lt;body&gt;&lt;script&gt;varstr="www.runoob.com!";document.write(str.subst…

  • 百度编辑器Ueditor 增加图片水印功能的解决方案

    百度编辑器Ueditor 增加图片水印功能的解决方案

  • 计算机实现原理专题–二进制减法器(二)

    计算机实现原理专题–二进制减法器(二)在计算机实现原理专题–二进制减法器(一)中说明了基本原理,现准备说明如何来实现。首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式:由于每次做减法时,我们可以人为的判断被减数和减数的大小,所以当被减数大于减数时中间结果一定会上溢也就是多出1位,因此中…

  • Jsp中EL表达式不解析问题

    Jsp中EL表达式不解析问题记一次很郁闷的Bug         前一天晚上写好的JSP页面,然后发布在Tomcat上面之后,一切正常。第二天早上打开之后,发现css样式始终加载不出来,刚开始以为网速问题(前一天晚上测试一切正常,因此排除代码问题),测试网络一切正常,这就跟尴尬了,那css加载不出来是什么意思,难不成遇见鬼了?于是在发布后的页面检查代码,发现页面没有解析EL表达式,找到问题就想办法解决,于是开始折腾,最终还是…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号