一、什么Dom4J方式
Dom4j是一个简单、灵活的开放源代码的库,是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate。
二、Java中使用Dom4J方式的准备工作
由于Dom4J并不是JDK中的API,需要自己到网络上下载相应的jar包,并且在需要使用Dom4J的项目中添加。
三、具体的Java代码实现
在java中用Dom4JAPI实现以下七种常见操作:(注释中解释具体操作)
0、创建解析器,得到Document对象、将修改结果输出到源文件
1、得到某个具体的节点内容
2、遍历所有元素节点
3、修改某个元素节点的主体内容
4、向指定元素节点中增加子元素节点
5、向指定元素节点上增加同级元素节点
6、删除指定元素节点
7、操作XML文件属性
待解析的XML文档内容:
<联系人列表>
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>30</年龄>
</联系人>
<联系人>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>31</年龄>
</联系人>
</联系人列表>
0、创建解析器,得到Document对象、将修改结果输出到源文件
//创建Dom4j解析器
SAXReader reader = new SAXReader();
//加载document对象
Document document = reader.read("src/j2ee/dom/linkman.xml");
//将结果保存到硬盘上
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"), OutputFormat.createPrettyPrint());//参数:文件输出流(目标文件),输出格式(有两种,一般选用PrettyPrint格式)
writer.write(document);
writer.close();
1、得到某个具体的节点内容(获取第二个联系人姓名,输出结果为李四)
public static void test01(Document document) {
//拿到根节点
Element root = document.getRootElement();
//拿到所有的联系人
List<Element> men = root.elements();
//拿到第二个联系人
Element man = men.get(1);
//打印第二个联系人的姓名
System.out.println(man.elementText("姓名"));
}
2、遍历所有元素节点
public static void treeWalk(Document document) {
//从根节点开始遍历
treeWalk( document.getRootElement() );
}
public static void treeWalk(Element element) {
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
//循环拿到当前节点下的每一个子节点
Node node = element.node(i);
//如果当前拿到的节点时一个元素,则输出元素名,且递归调用遍历方法遍历当前元素的子节点
if ( node instanceof Element ) {
System.out.println(node.getName());
treeWalk((Element) node);
}
}
}
输出结果:(将XML文档中的元素标签名按顺序输出)
联系人
姓名
EMAIL
年龄
联系人
姓名
EMAIL
年龄
3、修改某个元素节点的主体内容
/**
* 3、修改某个元素节点的主体内容 (李四年龄改为27)
*/
public static void test03(Document document) throws IOException {
//拿到根节点
Element root = document.getRootElement();
//拿到根节点下所有元素
List<Element> men = root.elements();
//拿到第二个联系人李四
Element man = men.get(1);
//拿到李四的年龄节点
Element name = man.element("年龄");
//将李四的年龄改为27
name.setText("27");
//将结果保存到硬盘上
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"), OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件发现联系人李四的年龄变为27
4、向指定元素节点中增加子元素节点
/**
* 4、向指定元素节点中增加子元素节点(张三姓名内添加暱称)
*/
public static void test04(Document document) throws IOException {
Element root = document.getRootElement();
List<Element> men = root.elements();
Element man = men.get(0);
//拿到第一个联系人的姓名节点
Element name = man.element("姓名");
//在姓名节点内添加元素"暱称"内容为"三哥"
name.addElement("暱称").setText("三哥");
//将结果保存到硬盘上
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件:(张三姓名下多了暱称节点,李四年龄在3操作时被修改)
<联系人列表>
<联系人>
<姓名>张三
<暱称>三哥</暱称>
</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>30</年龄>
</联系人>
<联系人>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>27</年龄>
</联系人>
</联系人列表>
5、向指定元素节点上增加同级元素节点
/**
* 5、向指定元素节点上增加同级元素节点(给李四年龄节点增加同级别节点婚否)
*/
public static void test05(Document document) throws IOException {
Element root = document.getRootElement();
List<Element> men = root.elements();
Element man = men.get(1);
//得到李四年龄节点
Element age = man.element("年龄");
//添加年龄节点的同级别节点"婚否",内容为"已婚"
age.getParent().addElement("婚否").setText("已婚");
//将结果保存到硬盘
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件:
<联系人列表>
<联系人>
<姓名>张三
<暱称>三哥</暱称>
</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>30</年龄>
</联系人>
<联系人>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>27</年龄>
<婚否>已婚</婚否>
</联系人>
</联系人列表>
6、删除指定元素节点
/**
* 6、删除指定元素节点(删除张三暱称)
*/
public static void test06(Document document) throws IOException {
Element root = document.getRootElement();
List<Element> men = root.elements();
Element man = men.get(0);
Element name = man.element("姓名");
Element nickname = name.element("暱称");
//删除了name元素(姓名)的子元素nickname(暱称)
name.remove(nickname);
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件:(暱称节点已经被删除)
<联系人列表>
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>30</年龄>
</联系人>
<联系人>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>27</年龄>
<婚否>已婚</婚否>
</联系人>
</联系人列表>
7、操作XML文件属性
/**
* 7、操作XML文件属性(联系人添加性别)
*/
public static void test07(Document document) throws IOException {
Element root = document.getRootElement();
List<Element> men = root.elements();
//遍历所有联系人
for (Element man: men) {
//给每个联系人添加属性"性别",内容为"男"
man.addAttribute("性别","男");
}
XMLWriter writer = new XMLWriter(new FileOutputStream("src/j2ee/dom/linkman.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
查看源文件:(性别属性被添加到联系人标签内)
<联系人列表>
<联系人 性别="男">
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>30</年龄>
</联系人>
<联系人 性别="男">
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<年龄>27</年龄>
<婚否>已婚</婚否>
</联系人>
</联系人列表>