JAVA高级特性——DOM4J解析XML
DOM4J
导包
在工程路径下创建lib文件夹,将DOM4J.jar包放到lib文件夹下,右键DOM4J.jar包,选择Build path -Add to Build Path 与工程绑定

Document:定义XML文档
Element:定义XML元素
Text:定义XML文本节点(DOM使用.getNodeType()判断)
Attribute:定义XML属性
具体API文档:http://tool.oschina.net/apidocs/apidoc?api=dom4j1.6.1%2Fapidocs
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4j {
private Document document;
/**
* 获得DOM对象
*/
public void getDom() {
//通过SAXReader(一种流的形式)读取文件
SAXReader reader=new SAXReader();
try {
//通过read()方法将读取的文件放到document中
document=reader.read(new File("phone.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
/**
* 显示所有信息
*/
public void showInfo() {
//先获得根节点
Element root=document.getRootElement();
/*//迭代器获得根节点下的所有Brand
Iterator eleBrands=root.elementIterator();
while(eleBrands.hasNext()) {
//将每一个取到的eleBrans转化成元素节点
Element eleBrand=(Element)eleBrands.next();
System.out.println(eleBrand.attributeValue("name"));
//迭代器获得当前Brand下的所有Type元素
Iterator eleTypes=eleBrand.elementIterator();
while(eleTypes.hasNext()) {
Element eleType=(Element)eleTypes.next();
System.out.println("\t"+eleType.attributeValue("name"));
}
}*/
//使用集合输出所有节点信息
//创建一个集合接收根节点下的所有Brand
List <Element> eleBrands=root.elements();
//遍历Brands,输出每一个Brand的name属性的值
for (Element eleBrand : eleBrands) {
System.out.println(eleBrand.attributeValue("name"));
//再创建一个集合接收每一个Brand下的所有Type
List <Element> Types=eleBrand.elements();
//遍历Types,输出每一个Type的name属性的值
for (Element eleType : Types) {
System.out.println(eleType.attributeValue("name"));
}
}
}
/**
* 增加信息
*/
public void addDom() {
//获得根元素
Element root=document.getRootElement();
//再根元素下创建元素名为Brand的元素
Element eleBrand=root.addElement("Brand");
eleBrand.addAttribute("name", "Vivo");
Element eleType=eleBrand.addElement("name");
eleType.addAttribute("name", "s27");
}
/**
* Brand元素增加id属性
*/
public void update() {
Element root=document.getRootElement();
Iterator eleBrands=root.elementIterator();
int id=0;
while(eleBrands.hasNext()) {
//将每一个取到的eleBrans转化成元素节点
Element eleBrand=(Element)eleBrands.next();
id++;
eleBrand.addAttribute("id", id+"");
}
}
/**
* 删除元素节点
*/
public void delete() {
Element root=document.getRootElement();
Iterator eleBrands=root.elementIterator();
while(eleBrands.hasNext()) {
//将每一个取到的eleBrans转化成元素节点
Element eleBrand=(Element)eleBrands.next();
if(eleBrand.attributeValue("name").equals("三星")) {
eleBrand.getParent().remove(eleBrand);
}
}
}
/**
保存文件
* @param path
*/
public void save(String path) {
//相当于DOM的转换器,以createPrettyPrint()输出
OutputFormat format=OutputFormat.createPrettyPrint();
//可以用setEncoding()方法设定保存编码
//format.setEncoding("UTF-8");
try {
//保存到path路径文件去,以format这种形式
XMLWriter writer=new XMLWriter(new FileOutputStream(path),format);
//直接将document写入
writer.write(document);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
Dom4j dom4j=new Dom4j();
dom4j.getDom();
//dom4j.addDom();
//dom4j.update();
//dom4j.delete();
//dom4j.save("phone1.xml");
dom4j.showInfo();
}
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PhoneInfo>
<Brand id="0" name="华为">
234234
<Type name="u920"/>
<Type name="4112"/>
<Type name="970"/>
</Brand>
<Brand id="1" name="苹果">
<Type name="i8"/>
<Type name="xs"/>
<Type name="xr"/>
</Brand>
<Brand name="三星">
<Type name="note3"/>
</Brand>
</PhoneInfo>
DOM4J是DOM解析的进一步封装,使用更简洁,获得节点的元素或者属性可以使用迭代器,也可以使用elements()方法获取集合,遍历操作。
浙公网安备 33010602011771号