在java环境下读取xml文件的方法主要有5种:DOM、SAX、JDOM、JAXB、dom4j,最常用、最好用的dom4j。
dom4j在xml解析方面是性能最好的,hibernate等框架都使用它作为解析的工具。
要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/ 目前最新dom4j包下载地址:
http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip
解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar
在实际应用中需要遍历整个XML文档,可以利用访问者(Visitor)模式的应用。Visitor模式通常用于处理对象树结构,树中的每一个节点对象都可以接受一个Visitor对象,节点对象向Visitor传递自身,而Visitor反过来则调用节点对象的操作。
在Visitor接口中,重载了所有节点访问的visit方法,例如:
public void visit(Element node);
public void visit(Attribute node);
......
在Node接口中,定义了一个accept()方法,例如:
public void accept(Visitor visitor);
所以节点都是继承了accept()方法,在这个方法中,visitor.Visit(this),向visitor对象传递自身。而且,在dom4j中的Element的accept()方法采用递归操作实现了遍历节点的功能。
此外,另一个类VisitorSupport类对Visitor接口空实现,可以继承此类,然后实现相应的方法就可以了。
Example:
XML:
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/xsl" href="students.xsl"?>
<students>
<student sn="01">
<name>张三</name>
<age>18</age>
</student>
<student sn="02">
<name>李四</name>
<age>20</age>
</student>
</students>
Parse.java
import java.io.File;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;
public class Parse {
public static void main(String[] args) {
SAXReader reader = new SAXReader();//通过SAXReader从文件读取XML文档
File file = new File("src/students.xml");
try {
Document doc = reader.read(file);
doc.accept(new MyVistor());//调用accept方法,接受一个访问者对象
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static class MyVistor extends VisitorSupport {
public void visit(Attribute node) { //对于属性节点
System.out.println("Attibute:---" + node.getName() + "="+ node.getValue());
}
public void visit(Element node) { //对于元素节点,判断是否只包含文本内容,如是,则打印元素的名称和内容,如不是,则只打印元素的名字
if (node.isTextOnly()) {
System.out.println("Element:---" + node.getName() + "="+ node.getText());
}else{
System.out.println("--------" + node.getName() + "-------");
}
}
@Override
public void visit(ProcessingInstruction node) { //对于处理指定节点,打印目标和数据
System.out.println("PI:"+node.getTarget()+" "+node.getText());
}
}
}
使用dom4j来将属性写入xml:
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class DWriter {
public static void main(String[] args) {
try {
XMLWriter writer = new XMLWriter(new FileWriter("src/author.xml"));
Document doc = createDoc();
writer.write(doc);
writer.close();
// Pretty print the document to System.out
// 设置了打印的格式,将读出到控制台的格式进行美化
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(System.out, format);
writer.write(doc);
} catch (IOException e) {
e.printStackTrace();
}
}
public static Document createDoc() {
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("root");
Element author1 = root.addElement("author").addAttribute("name","Kree").addAttribute("location", "UK").addText("Kree Strachan");
Element author2 = root.addElement("author").addAttribute("name", "King").addAttribute("location", "US").addText("King McWrirter");
return doc;
}
}
使用dom4j写入到author.xml文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<root>
<author name="Kree" location="UK">Kree Strachan</author>
<author name="King" location="US">King McWrirter</author>
</root>