dom4j 是一个组织,针对xml解析提供解析器dom4j
目录
一:dom4j中的操作
1.查询操作
//查询所有name标签下的值
private static void selectName() throws DocumentException {
/*
* 1.创建解析器
* 2.得到document
* 3.得到根节点
* 4.得到所有p1标签
* 5.得到name标签
*
*
*/
//创建解析器
SAXReader saxReader=new SAXReader();
//得到document
Document document=saxReader.read("src/person.xml");
//得到根节点
Element root =document.getRootElement();
List<Element> list=root.elements("p1");
for (Element element : list) {
Element e=element.element("name");
System.out.println(e.getText());
}
}
2.在末尾添加节点操作
//在第一个p1下添加sex,设置属性为女
private static void addSex() throws Exception {
/*
* 1.创建解析器
* 2.得到docuement节点
* 3.得到根节点
* 4.找到第一个p1,在p1下创建新节点
* 5.设置文本
* 6.回写xml文件
*/
//创建解析器
SAXReader saxReader=new SAXReader();
Document document=saxReader.read("src/person.xml");
//得到根节点
Element element=document.getRootElement();
//找到第一个p1
Element element1=element.element("p1");
Element sex=element1.addElement("sex");
sex.setText("女");
//回写xml文件
//格式化xml文件
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/person.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
}
3.在指定位置添加节点操作
//在age前面加入school标签
private static void addAgeBefore() throws Exception{
/*
* 1.创建解析器
* 2.得到documenet节点
* 3.得到根节点
* 4.得到p1下面的所有元素
* 5.创建指定节点并设置值
* 6.插入节点
* 7.回写xml
*/
//创建解析器
SAXReader saxReader=new SAXReader();
//得到document节点
Document document =saxReader.read("src/person.xml");
//得到根节点
Element element=document.getRootElement();
Element p1=element.element("p1");
List<Element> list=p1.elements();
//创建新节点
Element school=DocumentHelper.createElement("school");
school.setText("河北师范大学");
//在指定位置添加节点
list.add(1, school);
//回写xml文件
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/person.xml"),format );
xmlWriter.write(document);
xmlWriter.close();
}
4.Dom4jUtils小工具
自己编写的小工具为了dom4j操作更简洁方便,通过该工具类可以得到文件路径,得到document,写会xml文件的方法
public class Dom4jUtils {
public static final String PATH = "src/person.xml";
// 得到document
public static Document getDocuemnt(String path) {
/*
* 1.创建解析器 2.得到document
*/
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(path);
return document;
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// 回写xml文件
public static void xmlWriters(String path, Document document) {
try {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path), format);
xmlWriter.write(document);
xmlWriter.close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5.修改节点操作
//修改第一个p1下的sex为男
private static void modifySex() {
/*
* 1.得到document
* 2.找到第一个p1节点
* 3.找到sex节点
* 4.修改sex节点的值
* 5.回写xml文件
*/
//得到document
Document document=Dom4jUtils.getDocuemnt(Dom4jUtils.PATH);
Element root=document.getRootElement();
Element p1=root.element("p1");
Element sex=p1.element("sex");
sex.setText("男");
Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
}
5.删除节点操作
//删除第一个p1节点下的school节点
private static void delSchool() {
/*
* 1.得到document
* 2.找到第一个p1节点
* 3.找到school节点
* 4.找到school的父节点,从父节点上删除
* 5.回写xml文件
*/
Document document=Dom4jUtils.getDocuemnt(Dom4jUtils.PATH);
Element root=document.getRootElement();
Element p1=root.element("p1");
Element school =p1.element("school");
p1.remove(school);
Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
}
6.得到节点属性的值
//得到第一个p1节点下的ID1的属性的值
private static void getValues() {
Document document=Dom4jUtils.getDocuemnt(Dom4jUtils.PATH);
Element root=document.getRootElement();
Element p1=root.element("p1");
String value=p1.attributeValue("id1");
System.out.println(value);
}
二: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
准备:jar包:jaxen-1.1-beta-6.jar
使用xpath得到所有name元素的值:
//使用xpath得到所有name节点的值
private static void getNode() {
/*
* 1.得到docuemnt
* 2.得到所有name节点
* 3.解析name节点
*/
Document document=Dom4jUtils.getDocuemnt(Dom4jUtils.PATH);
List<Node> list=document.selectNodes("//name");
for(int i=0;i<list.size();i++) {
Node node=list.get(i);
System.out.println(node.getText());
}
}
使用xpath得到第一个p1下面name的值
//使用xpath得到第一个p1下的name的值
private static void getNode1() {
Document document=Dom4jUtils.getDocuemnt(Dom4jUtils.PATH);
Node node=document.selectSingleNode("//p1[@id1='真香']/name");
System.out.println(node.getText());
}