使用dom4j解析xml,一般实际开发中的主流
1)dom4j简介
dom4j,是一个组织,针对xml解析,提供解析器 dom4j,为什么说它是主流!其实在以前dom4j只是sum公司的一个部门,后来独立出来提供了dom4j,它结合很多jaxp的优点。dom4j不是javase的一部分,所以我们要使用它的时候必须要先导入dom4j的包。晚点跟xpath包和手册一起上传给大家,上传给大家下载
2)如何导入包操作
首先创建一个文件夹 lib,然后将包复制到该文件夹之下, 在jar包上右键选择->build path->Configure Build Path
结果:如果你看到一个小奶瓶的话表示导入成功,看截图
3)如何使用dom4j
这里介绍一个方法:我上传的文件中,包含了dom4j的文档说明。到底怎么查看?截图
4)一些函数:
//得到document,【注意】document的父接口是Node,如果在document里面找不到想要的方法,到Node里面去找
SAXReader reader = new SAXReader();
Document document = reader.read(url);
// document里面的方法 , 获取根节点 返回的是Element,一般从根节点往下操作
getRootElement()
//Element也是一个接口,父接口是Node,Element和Node里面方法
//获取父节点
getParent();
//添加标签,一般是父标签添加
addElement();
//表示获取标签下面的第一个子标签qname:标签的名称
element(qname);
//获取标签下面是这个名称的所有子标签(一层)qname:标签名称
elements(qname);
//获取标签下面的所有一层子标签
elements();
5)上代码案例
xml
//man.xml 路径:src/man.xml
<?xml version="1.0" encoding="UTF-8"?>
<preson>
<p1>
<name id1="xiaozheng">zhangsan</name>
<age>100</age>
</p1>
<p1>
<name>lisi</name>
<age>20</age>
</p1>
</preson>
查询所有name元素里面的值
//name在一定在根节点之下,那么前三步固定,独立出来,得到根节点
SAXReader saxReader = new SAXReader(); //创建解析器
Document document = saxReader.read("src/man.xml"); //得到doc
Element root = document.getRootElement(); //得到根节点
//获得到跟节点下面的所有p1
List<Element> list = root.elements("p1");
//遍历,找到name并且输出
for (Element element : list) {
Element name = element.element("name"); //p1下面寻找name
String s = name.getText(); //得到name值
System.out.println(s); //打印
}
//说到底就是里面element()等三个函数,层层递进,去找所需要的标签
得到第二个name
//前三部参考上面得到根节点。
List<Element> list = root.elements("p1");
Element p2 = list.get(1);
Element name = p2.element("name");
String s = name.getText();
System.out.println("第二个名字"+s);
增加:在第一个p1标签末尾添加一个元素 nv
//需求:p1添加,节点,也是就找到p1调用addElement();即可
Element p1 = root.element("p1");
Element sex1 = p1.addElement("sex");
sex1.setText("nv");
//回写操作,原因跟前面一样,单独分离出来写,后面多次用到
回写操作:四步,不懂看jaxp那篇,为什么要回写
OutputFormat format = OutputFormat.createPrettyPrint(); //可以有缩进的效果
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/man.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
增加:在第一个p1下面的age标签之前添加 < school>ecit.edu.cn< /schlool>
//需求:在某个标签之前添加,如果说,利用之前的找到age后添加就成了
<age>
<school></school>
</age>不符合要求
//前三步还是一样
Element p1 = root.element("p1");
List<Element> list = p1.elements();
Element school = DocumentHelper.createElement("school");
school.setText("ecit.edu.cn");
list.add(1,school);
修改:修改第一个p1下面的age元素的值 30
//前三步骤一样
Element p1 = root.element("p1");
Element age = p1.element("age");
age.setText("100");
//回写操作
删除:删除第一个p1下面的ecit元素
//前三步骤一样
Element p1 = root.element("p1");
Element school = p1.element("school");
p1.remove(school);
//回写操作
属性获取:获取第一个p1里面的属性id1的值
//前三步骤一样的
Element p1 = root.element("p1");
Element name = p1.element("name");
String value = name.attributeValue("id1");
System.out.println(value);