XML源文件:
<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo>
<Brand name="华为">
<Type name= "123"></Type>
<Type name= "456"></Type>
<Type name= "789"></Type>
</Brand>
<Brand name="iphone">
<Type name= "iphone6"></Type>
<Type name= "iphone7"></Type>
<Type name= "iphone4"></Type>
</Brand>
</PhoneInfo>
一、获取Document对象
代码如下:
// 获得Document对象
public void loadDocument() {
SAXReader saxReader = new SAXReader();
try {
document = saxReader.read(new File("手机信息.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
}
DOM4J中用来解析原始XML文件的工具是SAXReader 的read方法。由SAXReader 实例化出来的saxReader 对象就对应DOM里面的解析器。
二、遍历:显示手机的品牌和型号
代码如下:
// 显示手机的品牌和型号
public void showPhoneInfo() {
// 获取XML的根节点
Element root = document.getRootElement();
// 获取所有的Brand
Iterator eleBrands = root.elementIterator();
while (eleBrands.hasNext()) {
Element brand = (Element)eleBrands.next();
System.out.println(brand.attributeValue("name"));
Iterator eleTypes = brand.elementIterator();
while (eleTypes.hasNext()) {
Element type = (Element)eleTypes.next();
System.out.println("\t" + type.attributeValue("name"));
}
}
}
先获取根元素,然后通过迭代器的方式来遍历。获取属性值的方法是attributeValue()。
三、保存修改到XML文件
代码如下:
// 保存修改到XML文件
public void saveXML(String path) {
/*OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");*/
XMLWriter writer = null;
try {
writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path), "UTF-8"));
writer.write(document);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
分析:保存修改到XML文件的方法是XMLWriter对象的write方法。可以把XMLWriter看做是跟ObjectWriter一样的东西,只不过一个是写对象,一个是写XML。在XMLWriter实例化的时候,里面可以放一个Writer对象,一般可以用OutputStreamWriter,因为这个在写出去的时候可以指定字符编码格式,避免乱码。
同时,OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8");这段代码的作用是指定输出时候的各种格式,底层机理不清楚,视频也没讲明白。这里实例化出来的XMLWriter对象在构造的时候有一种构造方法是有OutputFormat参数的,所以如果需要用这个构造方法的话,就需要这两句代码了。
四、新增手机品牌信息
代码如下:
// 增加新的手机品牌信息
public void addNewPhone() {
// 获得XML的根元素
Element root = document.getRootElement();
// 创建Brand
Element eleBrand = root.addElement("Brand");
eleBrand.addAttribute("name", "三星");
// 创建Type
Element eleType = eleBrand.addElement("Type");
eleType.addAttribute("name", "Note2");
saveXML("newInfo.xml");
}
分析:这端代码的逻辑是直接在根节点下面去加元素节点,然后再在该元素节点下面去加其下一级的元素节点。其实内部逻辑跟DOM解析一样。
五、修改节点
代码如下:
// 修改节点,加id
public void updatePhone() {
Element root = document.getRootElement();
Iterator eleBrands = root.elementIterator();
int id = 0;
while (eleBrands.hasNext()) {
Element brand = (Element)eleBrands.next();
id++;
brand.addAttribute("id", id + "");
}
saveXML("newInfo.xml");
}
分析:其实就是个遍历+设置属性+保存。
六、删除节点
代码如下:
// 删除节点
public void deletePhone() {
Element root = document.getRootElement();
Iterator eleBrands = root.elementIterator();
while (eleBrands.hasNext()) {
Element brand = (Element)eleBrands.next();
if (brand.attributeValue("name").equals("iphone")) {
brand.getParent().remove(brand);
}
}
saveXML("newInfo.xml");
}
分析:其实就是个遍历+删除节点+保存。另外要注意删除节点是调用其父节点来删除的。
七、总结
DOM解析看懂之后再来看DOM4J,简直是小菜一碟。DOM4J比DOM要写的代码行数更少,更加简洁一点。相当于是对DOM4J进行了一次封装,用起来更加方便。