DOM方式:
创建DOM树
1、获取DocumentBuilderFactory对象:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2、通过DocumentBuilderFactory对象,获取DocumentBuilder对象:
DocumentBuilder db = dbf.newDocumentBuilder();
3、通过DocumentBuilder的newDocument方法获取Document对象,代表着要生成的DOM树
Document do = db.newDocument();
4、将根节点添加进DOM树
Element bookstore= document.createElement("bookStore");
document.appendChild(bookstore);
5、将子节点添加进DOM树
Element book = document.createElement("book");
bookstore.appendChild(book);
6、将子节点的属性及属性值添加进DOM树
book.setAttribute("id","1");
即:通过当前节点的appendChild(“节点名”);方法为其添加子节点
通过document的createElement(“节点名”);方法来建立新的节点
将DOM树转换成XML文件
1、创建TransformerFactory对象,Factory为工厂类,不能直接new对象,通过newInstance获取对象
TransformerFactory tff = TransformerFactory.newInstance();
2、通过tff获取Transfomer对象
Transformer tf = tff.newTransformer();
3、指定换行格式
tf.setOutputProperty(OutputKeys.INDENT,"yes");
4、用DOM树生成XML文件,将DOM树以及输出流作为参数传入
tf.transform(new DOMSource(do,new StreamResult(new File("*.xml"));
SAX方式:
使用SAX生成XML文件
1.创建一个TransformerFactory类的对象
SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory
.newInstance();
2.通过SAXTransformerFactory对象创建一个
TransformerHandler对象
TransformerHandler handler = tff.newTransformerHandler();
3.通过handler对象创建一个Transformer对象
Transformer tr = handler.getTransformer();
4.通过Transformer对象对生成的xml文件进行设置
// 设置xml的编码
tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// 设置xml的“是否换行”
tr.setOutputProperty(OutputKeys.INDENT, "yes");
5.创建一个Result对象
File f = new File("*.xml");
6.创建Result对象,并且使其与handler关联
Result result = new StreamResult(new FileOutputStream(f));
handler.setResult(result);
将节点写入XML文件中
1.打开Document
handler.startDocument();
2.创建属性对象
AttributesiImpl ai = new AttributesImpl();
3.创建无属性节点
handler.startElement(...);
4.创建有属性节点
ai.clear();(清除原有属性内容)
ai.addAttribute(...);(设置新的属性内容)
handler.startElement(...);
5.结束节点
handler.endElement();
6.结束Document
handler.endDocument();
DOM4J方式:
使用DOM4J生成XML文件
1、创建Document对象,代表着整个XML文档
Document document = DocumentHelper.createDocument();
2、创建根节点rss
Element rss = document.addElement("rss");
3、向rss根节点中添加version属性
rss.addAttribute("version","2.0");
4、创建XML文档的输出流
File file = new File("xxx");
XMLWriter writer = new XMLWriter(new FileOutputStream(file));
5、将程序所写的XML文档内容与输出流联系起来
writer.write(document);
writer.setEscapeText(false);转义
6、关闭资源
writer.close();
生成子节点
rss.addElement(...);
OutputFormat.createPrettyPrint();格式
JDOM方式:
使用JDOM生成XML文件
1、创建一个根节点,并设置属性以及属性值
Element element = new Element("rss");
ele.setAttribute("version","2.0");
2、创建Document对象,并将Element对象传入进去
Document document = new Document(element);
(有了文档之后就考虑如何将文档与要生成的XML文件联系起来,每种解析方式都提供了相应的输出流,原理都是通过一个方法将输出流与Document对象联系起来)
3、创建输出流对象
XMLOutputter outputer = new XMLOutputter(format);
4、通过XMLOutputter的对象方法output将Document对象转换为XML文件
outputer.output(document,new FileOutputStream(new File("*.xml)));
生成节点
Element element = new Element("root");
rss.addContent(element);
…
JDOM生成XML不会转义的方法:
创建CDATA数据传参。
RSS通常是用来描述和同步网站内容的一种格式,本质是xml
xml通常的用途就是可以共享数据
四种方式比较:
DOM:基于DOM Tree 会存在内存中,可以频繁的修改
SAX:基于事件 不会存在于内存,无法返回修改
DOM4J:基于底层API
JDOM:基于底层API
DOM方便后续改动操作,但比较占用内存,因为是加载整个DOM树在内存中。
SAX是逐步解析和写入的,也就是说在写入时,已经操作完成的写入部分是无法进行修改的,因为SAX是基于事件的,其将某一个标签走完之后是不能走回头路的,没有状态性可言,但SAX的性能是非常高的。
这两种方式的选择中很大一部分判断基于是否对文档进行频繁的修改
性能比较:
在一个课程测试用例中四种方式的用时:
DOM:418
SAX:3
JDOM:158
DOM4J:59
DOM SAX官方自带:DOM生成DOM树加载到内存,方便修改,但是性能最差。
SAX性能最高,但是不能修改。
DOM4J综合比较好。