使用DOM4J解析XML
DOM4J同时具备了DOM写入和SAX读取的操作,并做了存储优化,使用DOM4J时要导入dom4j的开发包dom4j-x.x.x.jar
。
DOM4J提供有自己的一堆实现类库:
DocumentHelper工具类:org.dom4j.DocumentHelper
No | 返回值 | 方法名 | 描述 |
---|---|---|---|
1 | Document | createDocument() | 创建新的文档 |
2 | Element | createElement(String name) | 创建新的文档,同时设置根元素 |
分支节点:org.dom4j.Branch
No | 返回值 | 方法名 | 描述 |
---|---|---|---|
1 | void | add(Element element) | 追加子节点 |
2 | void | addElement(String name) | 创建子节点并追加 |
3 | Node | node(int index) | 取得指定索引的节点 |
4 | int | nodeCount() | 取得子结点个数 |
5 | boolean | remove(Element element) | 删除子节点 |
节点使用:org.dom4j.Node
No | 返回值 | 方法名 | 描述 |
---|---|---|---|
1 | String | getName() | 取得节点名字 |
2 | void | setName(String name) | 设置节点名字 |
3 | Element | getParent() | 取得父节点 |
4 | String | getText() | 取得节点内容 |
5 | void | setText(String text) | 设置节点内容 |
文档对象:org.dom4j.Document
No | 返回值 | 方法名 | 描述 |
---|---|---|---|
1 | Element | getRootElement() | 取得根节点 |
元素对象:org.dom4j.Element
No | 返回值 | 方法名 | 描述 |
---|---|---|---|
1 | Attribute | attribute(String name) | 取得指定名称的属性 |
2 | String | attributeValue(String name) | 取得指定名称的属性内容 |
3 | Element | element(String name) | 取得指定名称的元素 |
4 | Iterator | elementIterator(String name) | 指定元素的Iterator对象 |
5 | List | elements(String name) | 取得指定的子元素集合 |
6 | List | elements() | 取得所有的子元素 |
输出格式化类:org.dom4j.io.OutputFormat
No | 返回值 | 方法名 | 描述 |
---|---|---|---|
1 | OutputFormat | createCompactFormat() | 紧凑格式输出 |
2 | OutputFormat | createPrettyPrint() | 缩进格式输出 |
XML文件输出类:org.dom4j.io.XMLWriter
No | 返回值 | 方法名 | 描述 |
---|---|---|---|
1 | XMLWriter(OutputStream out, OutputFormat format) | 构造方法 | |
2 | void | write(Document doc) | 输入文档 |
SAX解析输入类:org.dom4j.io.SAXReader
No | 返回值 | 方法名 | 描述 |
---|---|---|---|
1 | SAXReader() | 构造方法 | |
2 | Document | read(InputStream in) | 读取输入流数据 |
使用DOM4J实现XML文件输出
package dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
public class WriteTest {
public static void main(String[] args)throws Exception {
File file = new File("E:"+File.separator+"petshop.xml");
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
if(!file.exists()){
file.createNewFile();
}
String[] names = {"旺财","大明"};
String[] species = {"拉布拉多","品种独特"};
String[] prices = {"33.6","250.38"};
Document document = DocumentHelper.createDocument();
Element shopEle = document.addElement("shop");
for(int x=0;x<names.length;x++){
Element petEle = shopEle.addElement("pet");
petEle.addAttribute("id",String.valueOf(x+1));
petEle.addElement("name").setText(names[x]);
petEle.addElement("specie").setText(species[x]);
petEle.addElement("price").setText(prices[x]);
}
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
writer.write(document);
writer.close();
}
}
运行程序发现成功生成petshop.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<shop>
<pet id="1">
<name>旺财</name>
<specie>拉布拉多</specie>
<price>33.6</price>
</pet>
<pet id="2">
<name>大明</name>
<specie>品种独特</specie>
<price>250.38</price>
</pet>
</shop>
使用DOM4J读取文件
package dom4j;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
public class ReadTest {
public static void main(String[] args)throws Exception {
File file = new File("E:"+File.separator+"petshop.xml");
if(!file.exists()){
System.exit(0);
}
SAXReader reader = new SAXReader();
InputStream input = new FileInputStream(file);
Document document = reader.read(input);
Element rootEle = document.getRootElement();
Iterator<Element> petsIter = rootEle.elements("pet").iterator();
while(petsIter.hasNext()){
Element petEle = petsIter.next();
String id = petEle.attributeValue("id");
String name = petEle.element("name").getText();
String specie = petEle.element("specie").getText();
String price = petEle.element("price").getText();
System.out.println("id="+id+"\tname="+name+"\tspecie="+specie+"\tprice="+price);
}
input.close();
}
}
运行程序发现数据读取成功: