1、使用dom4j 解析xml
准备工作:
1)导入dom4j提供的jar包 // 因为 dom4j 不是javase的一部分,所以需要先导包
a.创建文件夹lib
b.复制jar包到lib中
c.右键dom4j -> 构建路径 -> 添加到构建路径
d.成功后dom4j前图标变为小奶瓶
知识点:
得到document文档
SAXReader saxReader = new SAXReader();
Document document = SAXReader.read(url);
方法:
document.getRootElemnet(); 获取根节点
Node.getParent(); 获取父节点。
element.addElement() ;添加标签
element(qname); 获取标签下的第一个子标签
elements(qname);获取标签下的一层子标签
elements(); 获取调用者的所有子标签
作为dom tree ,从上到下 一行一行解析
2、使用dom4j查询xml
(1)查询所有name元素里面的值
步骤:
1)创建解析器 //SAXReader saxReader = new SAXReader();
2)得到document //Document document = saxReader.read("src/dom4j/p1.xml");
3)得到根节点 // Element root = document.getRootElement();
4)得到所有的p1标签
//List<Element> list = root.elements();
//遍历集合 for (Element element : list)
5)得到name //Element name1 = element.element("name");
6)得到name的值 //name1.getText();
private static void selectName() throws Exception {
// TODO Auto-generated method stub
// 1)创建解析器
SAXReader saxReader = new SAXReader();
// 2)得到document
Document document = saxReader.read("src/dom4j/p1.xml");
// 3)得到根节点
Element root = document.getRootElement();
// 4)得到所有的p1标签
List<Element> list = root.elements();
// element(qname); 获取标签下的第一个子标签
// elements(qname);获取标签下的一层子标签
// elements(); 获取调用者的所有子标签
for (Element element : list) {
// 5)得到name
Element name1 = element.element("name");
// 6)得到name的值
String s = name1.getText();
System.out.println(s);
}
}
}
(2)获取第一个name的值
在(1)的基础上
修改 4)为 得到第一个p1 //Element p1 = root.element("p1");
(3)得到第二个name的值
在(1)的基础上
在 4) 中添加语句 Element p1 = list.get(1); //根据集合下标获取第二个p1
3、使用dom4j实现添加操作
在第一个 p1 后添加 man 标签。
步骤:
1)创建解析器 // SAXReader saxReader = new SAXReader();
2)得到document // Document document = saxReader.read("src/dom4j/p1.xml");
3)得到根节点 // Element root = document.getRootElement();
4)得到第一个p1 // Element p1 = root.element("p1");
5)在p1下直接添加 // Element sex1 = p1.addElement("sex");
6)在sex1下添加文本 //sex1.addText("man");
7)回写
a.OutputFormat format = OutputFormat.createPrettyPrint();
//写入格式为 PrettyPrint 通俗理解为带缩进
b.XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/dom4j/p1.xml"), format);
//XMLWriter表示一个写入器,可以生成包含 XML 数据的流或文件
传参为 1.文件路径new FileOutputStream("文件路径")
2. 写入格式
c.xmlWriter.write(document); //修改到文件
d.xmlWriter.close(); //流关闭
private static void addSex() throws Exception {
// TODO Auto-generated method stub
// 1)创建解析器
SAXReader saxReader = new SAXReader();
// 2)得到document
Document document = saxReader.read("src/dom4j/p1.xml");
// 3)得到根节点
Element root = document.getRootElement();
// 得到第一个p1
Element p1 = root.element("p1");
// 在p1下直接添加
Element sex1 = p1.addElement("sex");
// 在sex1下添加文本
sex1.addText("man");
// 回写
OutputFormat format = OutputFormat.createPrettyPrint(); // 有缩进的效果
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
"src/dom4j/p1.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
4、使用dom4j在特定位置添加元素 .add(int index , E element)
在第一个p1下面的age标签之前添加
步骤:
1)创建解析器 //SAXReader saxReader = new SAXReader();
2)得到document //Document document = saxReader.read("src/dom4j/p1.xml");
3)得到根节点 //Element root = document.getRootElement();
4)得到第一个p1 //Element p1 = root.element("p1");
5)获取p1下所有的元素 //List<Element> list = p1.elements();
6)创建标签 在标签下创建文本
//Element school = DocumentHelper.createElement("school");
//school.setText("xupt");
7)使用list方法,在特定位置添加元素
//list.add(1,school);
// 8)回写
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
"src/dom4j/p1.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
private static void addEleToAgeBefore() throws Exception {
// TODO Auto-generated method stub
// 1)创建解析器
// SAXReader saxReader = new SAXReader();
// 2)得到document
// Document document = saxReader.read("src/dom4j/p1.xml");
Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
// 3)得到根节点
Element root = document.getRootElement();
// 4)得到第一个p1
Element p1 = root.element("p1");
// 5)获取p1下所有的元素
List<Element> list = p1.elements();
// 6)创建标签 在标签下创建文本
Element school = DocumentHelper.createElement("school");
school.setText("xupt");
// 7)使用list方法,在特定位置添加元素 add(int index , E element)
list.add(1, school);
/*
* // 8)回写 OutputFormat format = OutputFormat.createPrettyPrint(); //
* 有缩进的效果 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
* "src/dom4j/p1.xml"), format); xmlWriter.write(document);
* xmlWriter.close();
*/
// 使用封装文件方法
Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
}
5、使用dom4j实现修改节点的操作(使用封装类 public class Dom4jUtils )
修改第一个p1下age元素的值 .setText();
步骤:
1)得到document //Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
2)得到根节点 // Element root = document.getRootElement();
3)得到第一个p1 // Element p1 = root.element("p1");
4)得到p1下的age // Element age1 = p1.element("age");
5)修改age的值 //age1.setText("300");
6)回写到xml //Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
private static void setAge() throws Exception {
// 1)得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
// 2)得到根节点
Element root = document.getRootElement();
// 3)得到第一个p1
Element p1 = root.element("p1");
// 4)得到p1下的age
Element age1 = p1.element("age");
// 5)修改age的值
age1.setText("300");
// 6)回写
Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
}
5、使用dom4j实现删除节点的操作(使用封装类 public class Dom4jUtils )
删除p1下的school 方法: .remove(school);
步骤:
1)得到document // Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
2)得到根节点 // Element root = document.getRootElement();
3)得到第一个p1 // Element p1 = root.element("p1");
4)得到p1下的school // Element school = p1.element("school");
5)获取school标签的父节点,然后删除school
// Element schParent = school.getParent();
// schParent.remove(school);
// 6)回写
Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
private static void delSchool() {
// 1)得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
// 2)得到根节点
Element root = document.getRootElement();
// 3)得到第一个p1
Element p1 = root.element("p1");
// 4)得到p1下的school
Element school = p1.element("school");
// 5)获取school标签的父节点,然后删除school
Element schParent = school.getParent();
schParent.remove(school);
// 6)回写
Dom4jUtils.xmlWriters(Dom4jUtils.Path, document);
}
6、使用dom4j获取属性值(使用封装类 public class Dom4jUtils )
删除p1下的属性id1的值 .attributeValue(“id1”);
步骤:
// 1)得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
// 2)得到根节点
Element root = document.getRootElement();
// 3)得到第一个p1
Element p1 = root.element("p1");
// 4)得到p1里面 id1 的属性值
String s = p1.attributeValue("id1");
// 5)输出属性值
System.out.println(s);
private static void getValue() {
// TODO Auto-generated method stub
// 1)得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.Path);
// 2)得到根节点
Element root = document.getRootElement();
// 3)得到第一个p1
Element p1 = root.element("p1");
// 4)得到p1里面 id1 的属性值
String s = p1.attributeValue("id1");
// 5)输出属性值
System.out.println(s);
}
注:封装方法代码(得到文件document 和 回写xml)
public class Dom4jUtils {
//封装路径
public static final String Path = "src/dom4j/p1.xml";
// 封装得到document
public static Document getDocument(String path) {
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 (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}