DOM和SAX方式是JAVA官方提供的方式,可以生成一个XML文件来存储信息,DOM4J和JDOM是非官方的方式,可以生成一个RSS文件。
1 应用DOM方式写入XML
1.1 准备工作
和之前用DOM方式读取XML文件相同,需要创建一个DocumentBuilder对象:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder();
因为需要生成一个XML文件,所以不需要用parse()方法,直接用newDocument()方法获取一个Document对象 ,它就代表了我们要放在xml文件中的DOM树:
Document document = db.newDocument();
1.2 创建元素、属性及元素中的文本
用createElement(String ElementName)方法创建一个元素,并通过appendChild(Element e)方法给它添加子元素:
//创建根元素 Element school = document.createElement("school"); //将根元素添加到document中去 document.appendChild(school); //创建一个元素,并把它追加到根元素的子元素 Element student = document.createElement("student"); school.appendChild(student);
给元素设置属性,使用setAttribute(name, value)方法:
student.setAttribute("id", "0001");
通过setTextContext(String)方法给元素添加文本:
name.setTextContext("王明");
备注:
1. Document和Element对象中都有appendChild()方法,前者用来添加根元素,且只能使用一次,否则会产生错误(HIERARCHY_REQUEST_ERR: 尝试在不允许的位置插入节点),后者用来给调用它的元素添加子元素。
1.3 创建XML文件
创建TransformerFactory对象通过newInstance(),然后创建Transformer对象通过TransformerFactory对象的newTransformer()方法(注意和DocumentBuilder(Factory)对比):
TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer();
Transformer对象中的方法transform(Source , stream)方法可以将我们创建好的Document对象转化为XML文件:
tf.transform(new DOMSource(document),new streamResult(new File("students.xml");
可以看到这样创建的xml文件所有的都在一行,可以使用tf的setOutProperty()方法来设置输出的属性:
tf.setOutputProperty(OutputKeys.INDENT,"yes");
2 应用SAX方式写入XML
2.1 准备工作
创建一个SAXTransformerFactory类的对象:
SAXTransformerFactory stff = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
通过SAXTransformerFactory对象的newTransformerHandler()方法创建TransformerHandler的实例:
TransformerHandler handler = stff.newTransformerHandler();
通过handler对象创建一个transformer对象:
Transformer transformer = handler.getTransformer();
通过setOutputProperty()方法设置编码格式、是否换行等属性:
transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes");
创建一个Result对象,通过它去进行文件的创建和输出流的编写,并且使其与handler关联:
Result result = new StreamResult(new fileOutputStream(new File("students2.xml"))); handler.setResult(result);
2.2 生成子元素及属性
利用handler对象进行xml文件内容的编写:
通过startDocument()方法打开document(),并添加元素通过startElement(String url,String localName,String qName,String attributes)方法(其中前两个(与命名空间有关)可以为空,后两个为元素名和元素属性集合):
handler.startDocument(); handler.startElement("","","school",attr);//attr参数在下一步介绍
在上一步中需要传递Attributes,创建一个AttributesImpl对象,通过addAttribute(String url,String localName,String qName,String type,String value):
AttributeImpl attr = new AttributeImpl(); attr.addAttribute("","","id","","0001");
- 给元素添加文本,通过character(
按上述,会发现生成的XML文件里并没有内容,需要调用endDocument()结束,同时,在结束前必须调用endElement(String url,String localName,String qName)方法结束每个元素(给元素添加结束标志):
handler.endElement("","","school"); handler.endDocument();
备注:
- 注意每个元素的startElement和endElement方法的嵌套和主子元素对应,否则XML文件中会出现错误
- 注意开始和结束调用startDocument和endDocument方法
- transformer设置属性必须在handler.setResult(result)前面写,否则设置的属性不会生效
3 应用DOM4J方式写入XML
3.1 RSS简介
简易信息聚合(聚合内容)是一种RSS基于XML标准,在互联网上被广泛采用的内容包装和投递协议。RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用。
3.2 生成RSS元素及属性
通过DocumetHelper下的createDocument()方法获取一个Document实例(代表整个XML文件):
Document document = DocumentHelper.createDocument();
通过Document中的addElement(String)方法创建根元素,通过addAttribute(String,String)方法给根元素添加属性:
Element rss = document.addElement("rss"); rss.addAttribute("version","2.0");
在某个元素中创建子元素通过Element中的addElement(String)方法,并通过setText(String)方法向元素中添加文本内容:
Element channel = rss.addElement("channel"); channel.setText("CSDN");
3.3 生成XML文件
通过XMLWriter的write()方法创建,利用XMLWriter的Output参数的构造方法来创建XMLWriter实例:
File file = new File("rssnews.xml"); XMLWriter writer = new XMLWriter(new FileOutputStream(file));
设置XML文件格式,通过OutputFormat的createPrettyPrint()方法设置一个比较“漂亮”的格式(缩进和换行),通过setEncoding(String encoding)方法设置编码格式:
OutputForm format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK");
这样将format传给XMLWriter的构造方法,修改上一步的代码,使用另一个构造方法:
XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
处理转义字符(如尖括号“<”):
writer.setEscapeText(false);
该方法的默认参数值为 true,代表转义,所以 false 代表不转义。
将document写入创建好的xml文件:
writer.write(document);
备注:
1. 注意抛出的异常;
2. 以上所使用的类来自org.dom4j包下。
4 应用JDOM方式解析XML
生成根元素,并为其添加属性:
Element rss = new Element("rss"); rss.setAttribute("version","2.0");
通过传入根元素的构造方法生成一个document对象:
Document document = new Document(rss);
给元素添加子元素,并给子元素添加文本内容
Element channel = new Element("channel"); rss.addContent(channel); channel.setText("CSDN");
创建一个XMLOutputer对象,将document转换成XML文档:
XMLOutputter outputter = new XMLOutputter(); outputter.output(document , new FileOutputStream(new File("rssnews.xml")));
需要在XML中进行格式设置,可以给XMLOutputter()传递Format对象进行设置换行缩进、编码格式等:
Format format = Format.getCompactFormat(); format.setIndent("");