1.Document对象相关
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.节点相关
(1) 获取文档根节点
Element rootElm = document.getRootElement();
(2) 获取某节点的单个子节点
Element memberElm = root.element("member");//member是节点名
(3) 取得节点的文字
String text = memberElm.getText();
(4) 取得某节点下名为"member"的所有子节点并进行遍历.
List nodes = rootElm.elements("member");//获取到名称为member的节点集合,member的子节点需要用elements函数获取
for(Iterator it = nodes.iterator(); it.hasNext();){
Element elm = (Element)it.next();
//...
}
(5) 对某节点下的所有子节点进行遍历
for(Iterator it = root.elementIterator();it.hasNext()){
Element element = (Element)it.next();
//...
}
(6) 在某节点下添加子节点
Element ageElm = newMemberElm.addElement("age");
(7) 设置节点文字
ageElm.setText("29");
(8)删除某节点
parentElm.remove(childElm);//childElm是待删除的节点
(9)添加一个CDATA节点
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
contentElm.getText(); //获取节点的CDATA值与获取节点的值是同一个
contentElm.clearContent(); //清除节点的内容,CDATA亦可。
3. 属性相关
(1) 取得某节点下的某属性
Element root = document.getRootElement();
Atrribute attribute = root.attribute("size");//属性名为size
(2) 取得属性的文字
String text = attribute.getText();
(3) 遍历某节点的所有属性
Element root = document.getRootElement();
for(Iterator it = root.attributeIterator(); it.hasNext();){
Attribute attribute = (Attribute)it.next();
String text = attribute.getText();
System.out.println(text);
}
(4) 设置某节点的属性和文字
newMemberEml.addAtrribute("name","sitinspring");
(5) 设置属性的文字
Attribute attribute = root.attribute("name");
attribute.setText("sitinspring");
4.采用XPATH获取节点元素
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接获取到某个元素
使用dom4j支持xpath的操作的几种主要形式
第一种形式
/AAA/DDD/BBB: 表示一层一层的,AAA下面 DDD下面的BBB
第二种形式
//BBB: 表示和这个名称相同,表示只要名称是BBB,都得到
第三种形式
"/*": 所有元素
第四种形式
BBB[1]: 表示第一个BBB元素
BBB[last()]:表示最后一个BBB元素
第五种形式
//BBB[@id]: 表示只要BBB元素上面有id属性,都得到
第六种形式
//BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1
使用dom4j支持xpath具体操作
默认的情况下,dom4j不支持xpath,如果想要在dom4j里面是有xpath,第一步需要,引入支持xpath的jar包,如下:
在dom4j里面提供了两个方法,用来支持xpath
selectNodes("xpath表达式"),获取多个节点
selectSingleNode("xpath表达式"),获取一个节点
注意XPATH获取的是NODE,NODE与ELEMENT之间可以相互转换.
示例1
XML内容
<?xml version="1.0" encoding="gb2312"?>
<students>
<student age="25"><!--如果没有age属性,默认的为20-->
<name>崔卫兵</name>
<college>PC学院</college>
<telephone>62354666</telephone>
<notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
</student>
<student>
<name>张洪泽</name>
<college leader="leader">PC学院</college><!--如果没有leader属性,默认的为leader-->
<telephone>62358888</telephone>
<notes>男,1987年生,硕士,现就读于中国农业大学</notes>
</student>
</students>
读取程序
Dom4jReadExmple
public class Dom4jReadExmple {
/**
* 遍历整个XML文件,获取所有节点的值与其属性的值,并放入HashMap中
*
* @param filename
* String 待遍历的XML文件(相对路径或者绝对路径)
* @param hm
* HashMap 存放遍历结果
*/
public void iterateWholeXML(String filename, List<HashMap<String, String>> hm) {
SAXReader saxReader = new SAXReader();
try {
File f = new File(filename);
Document document = saxReader.read(f);
Element root = document.getRootElement();
// 遍历根结点(students)的所有孩子节点(肯定是student节点)
for (Iterator iter = root.elementIterator(); iter.hasNext();) {
HashMap<String,String> stuHM = new HashMap<String,String>();
Element element = (Element) iter.next();
// 获取student节点的age属性的值
Attribute ageAttr = element.attribute("age");
if (ageAttr != null) {
String age = ageAttr.getValue();
if (age != null && !age.equals("")) {
stuHM.put(element.getName() + "-" + ageAttr.getName(), age);
} else {
stuHM.put(element.getName() + "-" + ageAttr.getName(), "20");
}
} else {
stuHM.put(element.getName() + "-age", "20");
}
// 遍历student结点的所有孩子节点(即name,college,telphone,notes),并处理
for (Iterator iterInner = element.elementIterator(); iterInner.hasNext();) {
Element elementInner = (Element) iterInner.next();
if (elementInner.getName().equals("college")) {
stuHM.put(elementInner.getName(), elementInner.getText());
// 获取college节点的leader属性的值
Attribute leaderAttr = elementInner.attribute("leader");
if (leaderAttr != null) {
String leader = leaderAttr.getValue();
if (leader != null && !leader.equals("")) {
stuHM.put(elementInner.getName() + "-" + leaderAttr.getName(), leader);
} else {
stuHM.put(elementInner.getName() + "-" + leaderAttr.getName(), "leader");
}
} else {
stuHM.put(elementInner.getName() + "-leader", "leader");
}
} else {
stuHM.put(elementInner.getName(), elementInner.getText());
}
}
hm.add(stuHM);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
//读取代码
TestDom4jReadExmple
public class TestDom4jReadExmple {
public static void main(String[] args) {
try{
//获取解析完后的解析信息
List<HashMap<String,String>> hashMap;
Dom4jReadExmple drb=new Dom4jReadExmple();
//遍历整个XML文件
hashMap = new ArrayList<HashMap<String,String>>();
String n = System.getProperty("user.dir");//获取当前工程真实路径
//studentInfo.xml保存学生信息,放在src目录下
drb.iterateWholeXML(n+"\\src\\studentInfo.xml", hashMap);
for(HashMap stuHM:hashMap){
System.out.print(stuHM.get("name")+"\t");
System.out.print(stuHM.get("student-age")+"\t");
System.out.print(stuHM.get("college")+"\t");
System.out.print(stuHM.get("college-leader")+"\t");
System.out.print(stuHM.get("telephone")+"\t");
System.out.println(stuHM.get("notes")+"\t");
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
示例2
采用XPATH读取
<?xml version="1.0" encoding="UTF-8"?>
<class>
<student>
<name>张三</name>
<sid>111111</sid>
</student>
<student id="stu1">
<name>李四</name>
<sid>222222</sid>
</student>
</class>
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Dom4jXpath {
public static void main(String[] args) throws Exception {
select();//查询所有name的值
//select2();//查询id=stu1的学生的name的值
}
//查询所有name的值
private static void select() throws Exception {
SAXReader saxReader=new SAXReader();
Document document=saxReader.read("src/1.xml");
List<Node>list=document.selectNodes("//name");
for(int i=0;i<list.size();i++)
System.out.println(list.get(i).getText());
}
//查询id=stu1的学生的name的值
private static void select2() throws Exception {
SAXReader saxReader=new SAXReader();
Document document=saxReader.read("src/1.xml");
Node node=document.selectSingleNode("//student[@id='stu1']/name");
System.out.println(node.getText());
}
}