首先为什么会有dom4j呢?
因为dom太耗内存,而sax只能对xml进行读取,而不能去添加、删除等。所以出现了dom4j,它的效率更高,同时也可以进行crud操作。
1.dom4j介绍dom4j是一个简单、灵活地开放源代码的库。dom4j是由早期开发jdom的人分离出来而后独立开发的。与jdom不同的是,dom4j使用接口和抽象基类,虽然dom4j的api相对要复杂一些,但它提供了比jdom更好的灵活性。
dom4j是一个非常优秀的java xml api,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的dom4j,例如hibernate,包括sun公司自己的jaxp也用了dom4j。
使用dom4j开发,需下载dom4j相应的jar文件,并导入到项目。下载地址dom4j下载
2.dom4j案例依然使用我们之前的xml文件:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
<学生 地址="香港">
<名字>周小星</名字>
<年龄>23</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 地址="澳门">
<名字>林晓</名字>
<年龄>25</年龄>
<介绍>是一个好学生</介绍>
</学生></班级>
该文档放在com.dom4j.test包中。
使用dom4j也要获取代表整个文档document对象,不过这个document对象是org.dom4j包中的。
在主方法中获取document对象如下:
// 1.得到一个解析器saxreader saxreader = new saxreader();
// 2.指定解析哪个xml文件document document = saxreader.read(new file("src/com/dom4j/test/myclass.xml"));
然后我们就可以根据需求来写相应的方法,在主方法中调用。
【1】指定读取某个元素(读取第一个学生的信息)
public static void read(document document) { // 得到根元素
element root = document.getrootelement(); // root.elements("学生"):表示取出root下的所有学生元素
// root.element("学生"):表示取出root下的第一个学生元素
element student = root.element("学生"); // 取出属性
string address = student.attributevalue("地址"); // 取出各个子节点的值
string name = student.element("名字").gettext();
string age = student.element("年龄").gettext();
string intro = student.element("介绍").gettext();
system.out.println(address);
system.out.println(name);
system.out.println(age);
system.out.println(intro);
}
【2】添加元素:添加一个学生信息到xml文档中
public static void add(document document) throws exception { // 首先我们来创建一个学生节点对象
element student = documenthelper.createelement("学生");
element name = documenthelper.createelement("名字");
name.settext("小强");
element age = documenthelper.createelement("年龄");
age.settext("22");
element intro = documenthelper.createelement("介绍");
intro.settext("是一个三好学生"); // 把三个子元素加到student节点下
student.add(name);
student.add(age);
student.add(intro); // 为学生添加属性
student.addattribute("地址", "大理"); // 将学生节点添加到根节点下
document.getrootelement().add(student); // 更新xml文件,直接输出会出现中文乱码,要用outputformat
outputformat output = outputformat.createprettyprint(); // 设置输出的编码为utf-8
output.setencoding("utf-8"); // 这里一定要用fileoutputstream字节流输出,不能用filewriter,否则还会有乱码
xmlwriter xmlwriter = new xmlwriter(new fileoutputstream("src/com/dom4j/test/myclass.xml"), output);
xmlwriter.write(document);
xmlwriter.close();
}
添加学生到xml文档中,也需要在最后将内存中的document对象写入相应的文件,不然所有的操作只是在内存中进行,并不会输出到文件中,这与dom类似。
我们依然可以将这段更新的代码单独写成一个方法,如下:
public static void update(document document) throws exception { // 更新xml文件,直接输出会出现中文乱码,要用outputformat
outputformat output = outputformat.createprettyprint(); // 设置输出的编码为utf-8
output.setencoding("utf-8");
xmlwriter xmlwriter = new xmlwriter(new fileoutputstream("src/com/dom4j/test/myclass.xml"), output);
xmlwriter.write(document);
xmlwriter.close();
}
【3】添加一个元素到指定位置
public static void addbyindex(document document) throws exception { // 创建一个元素
element newstu = documenthelper.createelement("学生");
newstu.settext("王小明"); // 得到所有学生的list
list allstudent = document.getrootelement().elements("学生");
allstudent.add(1, newstu);
update(document);
}
这里其实是直接在得到的list中添加,然后更新即可。这里的list就是java.util包中的list
【4】删除一个元素或者删除这个元素的属性
删除一个元素与dom类似,都是通过相应的父节点删除该节点。比方说我们要删除第一个学生节点:
public static void delete(document document) throws exception { // 找到该元素
element student = document.getrootelement().element("学生"); // 删除元素的某个属性
student.remove(student.attribute("地址")); // 通过父节点删除节点
student.getparent().remove(student);
update(document);
}
【5】更新元素
比如我们要把所有学生的年龄加1,并且将所有学生的地址属性改为美国:
public static void updateageandaddress(document document) throws exception {
element root = document.getrootelement();
list<element> list = root.elements(); for (element element : list) { // 更新属性
element.addattribute("地址", "美国"); // 更新年龄子节点的值
element e_age = element.element("年龄"); int age = integer.parseint(e_age.gettexttrim());
e_age.settext(string.valueof(age + 1));
}
update(document);
}
首先为什么会有dom4j呢?
因为dom太耗内存,而sax只能对xml进行读取,而不能去添加、删除等。所以出现了dom4j,它的效率更高,同时也可以进行crud操作。
1.dom4j介绍dom4j是一个简单、灵活地开放源代码的库。dom4j是由早期开发jdom的人分离出来而后独立开发的。与jdom不同的是,dom4j使用接口和抽象基类,虽然dom4j的api相对要复杂一些,但它提供了比jdom更好的灵活性。
dom4j是一个非常优秀的java xml api,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的dom4j,例如hibernate,包括sun公司自己的jaxp也用了dom4j。
使用dom4j开发,需下载dom4j相应的jar文件,并导入到项目。下载地址dom4j下载
2.dom4j案例依然使用我们之前的xml文件:
<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
<学生 地址="香港">
<名字>周小星</名字>
<年龄>23</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 地址="澳门">
<名字>林晓</名字>
<年龄>25</年龄>
<介绍>是一个好学生</介绍>
</学生></班级>
该文档放在com.dom4j.test包中。
使用dom4j也要获取代表整个文档document对象,不过这个document对象是org.dom4j包中的。
在主方法中获取document对象如下:
// 1.得到一个解析器saxreader saxreader = new saxreader();
// 2.指定解析哪个xml文件document document = saxreader.read(new file("src/com/dom4j/test/myclass.xml"));
然后我们就可以根据需求来写相应的方法,在主方法中调用。
【1】指定读取某个元素(读取第一个学生的信息)
public static void read(document document) { // 得到根元素
element root = document.getrootelement(); // root.elements("学生"):表示取出root下的所有学生元素
// root.element("学生"):表示取出root下的第一个学生元素
element student = root.element("学生"); // 取出属性
string address = student.attributevalue("地址"); // 取出各个子节点的值
string name = student.element("名字").gettext();
string age = student.element("年龄").gettext();
string intro = student.element("介绍").gettext();
system.out.println(address);
system.out.println(name);
system.out.println(age);
system.out.println(intro);
}
【2】添加元素:添加一个学生信息到xml文档中
public static void add(document document) throws exception { // 首先我们来创建一个学生节点对象
element student = documenthelper.createelement("学生");
element name = documenthelper.createelement("名字");
name.settext("小强");
element age = documenthelper.createelement("年龄");
age.settext("22");
element intro = documenthelper.createelement("介绍");
intro.settext("是一个三好学生"); // 把三个子元素加到student节点下
student.add(name);
student.add(age);
student.add(intro); // 为学生添加属性
student.addattribute("地址", "大理"); // 将学生节点添加到根节点下
document.getrootelement().add(student); // 更新xml文件,直接输出会出现中文乱码,要用outputformat
outputformat output = outputformat.createprettyprint(); // 设置输出的编码为utf-8
output.setencoding("utf-8"); // 这里一定要用fileoutputstream字节流输出,不能用filewriter,否则还会有乱码
xmlwriter xmlwriter = new xmlwriter(new fileoutputstream("src/com/dom4j/test/myclass.xml"), output);
xmlwriter.write(document);
xmlwriter.close();
}
添加学生到xml文档中,也需要在最后将内存中的document对象写入相应的文件,不然所有的操作只是在内存中进行,并不会输出到文件中,这与dom类似。
我们依然可以将这段更新的代码单独写成一个方法,如下:
public static void update(document document) throws exception { // 更新xml文件,直接输出会出现中文乱码,要用outputformat
outputformat output = outputformat.createprettyprint(); // 设置输出的编码为utf-8
output.setencoding("utf-8");
xmlwriter xmlwriter = new xmlwriter(new fileoutputstream("src/com/dom4j/test/myclass.xml"), output);
xmlwriter.write(document);
xmlwriter.close();
}
【3】添加一个元素到指定位置
public static void addbyindex(document document) throws exception { // 创建一个元素
element newstu = documenthelper.createelement("学生");
newstu.settext("王小明"); // 得到所有学生的list
list allstudent = document.getrootelement().elements("学生");
allstudent.add(1, newstu);
update(document);
}
这里其实是直接在得到的list中添加,然后更新即可。这里的list就是java.util包中的list
【4】删除一个元素或者删除这个元素的属性
删除一个元素与dom类似,都是通过相应的父节点删除该节点。比方说我们要删除第一个学生节点:
public static void delete(document document) throws exception { // 找到该元素
element student = document.getrootelement().element("学生"); // 删除元素的某个属性
student.remove(student.attribute("地址")); // 通过父节点删除节点
student.getparent().remove(student);
update(document);
}
【5】更新元素
比如我们要把所有学生的年龄加1,并且将所有学生的地址属性改为美国:
public static void updateageandaddress(document document) throws exception {
element root = document.getrootelement();
list<element> list = root.elements(); for (element element : list) { // 更新属性
element.addattribute("地址", "美国"); // 更新年龄子节点的值
element e_age = element.element("年龄"); int age = integer.parseint(e_age.gettexttrim());
e_age.settext(string.valueof(age + 1));
}
update(document);
}
以上就是xml—xml解析之dom4j的内容。