dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,
具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它. 对主流的java XML
API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来
越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件 1.官网下载: http://www.dom4j.org/dom4j-1.6.1/
2.dom4j是sourceforge.NET上的一个开源项目,因此可以到http://sourceforge.net/projects/dom4j
或者https://dom4j.github.io/下载其最新版.同时,后者也是相应的教程。
然后打开dom4j-1.6.1的解压文件,在这里可以看到有docs帮助的文件夹,也有需要使用dom4j解析xml
文件的dom4j-1.6.1.jar文件.我们只需要把dom4j-1.6.1.jar文件构建到我们开发的项目中就可以使用dom4j开发了.
1、环境准备:下载dom4j-1.6.1.jar
2. 基本介绍:解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:
(1)自己创建Document对象
Document document = DocumentHelper.createDocument();
Element root = document.addElement("students");
其中students是根节点,可以继续添加其他节点等操作。
(2)读取XML文件获取Document对象
//创建SAXReader对象
SAXReader reader = new SAXReader();
//读取文件 转换成Document
Document document = reader.read(new File("XXXX.xml"));
(3)读取XML文本内容获取Document对象
String xmlStr = "<students>......</students>";
Document document = DocumentHelper.parseText(xmlStr);
3. 具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
(2)解析文件并且遍历打印:
(3)添加/删除节点
(4)添加/删除节点中的某个属性值
(5) 更新节点的值或属性值
(6)将XML内容写入到文件
demo传送门:
https://github.com/215836017/ParseXML_java
https://github.com/215836017/ParserXML_android
注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。
具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它. 对主流的java XML
API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来
越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件 1.官网下载: http://www.dom4j.org/dom4j-1.6.1/
2.dom4j是sourceforge.NET上的一个开源项目,因此可以到http://sourceforge.net/projects/dom4j
或者https://dom4j.github.io/下载其最新版.同时,后者也是相应的教程。
然后打开dom4j-1.6.1的解压文件,在这里可以看到有docs帮助的文件夹,也有需要使用dom4j解析xml
文件的dom4j-1.6.1.jar文件.我们只需要把dom4j-1.6.1.jar文件构建到我们开发的项目中就可以使用dom4j开发了.
1、环境准备:下载dom4j-1.6.1.jar
2. 基本介绍:解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:
(1)自己创建Document对象
Document document = DocumentHelper.createDocument();
Element root = document.addElement("students");
其中students是根节点,可以继续添加其他节点等操作。
(2)读取XML文件获取Document对象
//创建SAXReader对象
SAXReader reader = new SAXReader();
//读取文件 转换成Document
Document document = reader.read(new File("XXXX.xml"));
(3)读取XML文本内容获取Document对象
String xmlStr = "<students>......</students>";
Document document = DocumentHelper.parseText(xmlStr);
3. 具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
<students>
<student>
<name sex="man">小明</name>
<nickName>明明</nickName>
<age>20</age>
<address>北京</address>
</student>
<student>
<name sex="woman">小红</name>
<nickName>红红</nickName>
<age>20</age>
<address>上海</address>
</student>
<student>
<name sex="man">小亮</name>
<nickName>亮亮</nickName>
<age>30</age>
<address>广州</address>
</student>
<student-0>
<name sex="man">小亮-0</name>
<nickName>亮亮-0</nickName>
<age>200</age>
<address>广州-0</address>
</student-0>
</students>
(2)解析文件并且遍历打印:
private void parseXml(int flag) {
long startTime = System.currentTimeMillis();
System.out.println("Dom4j开始解析: " + startTime);
Bean1 bean = null;
try {
// 创建SAXReader对象
SAXReader reader = new SAXReader();
// 读取文件 转换成Document
Document document = reader.read(xmlFile);
// 获取根节点元素对象
Element rootElement = document.getRootElement();
// 第一种方法遍历
// listNodes(rootElement);
// 第二种方法遍历
List<Element> elements = rootElement.elements();
for (Element child : elements) {
// 未知属性名情况下
/*
* List<Attribute> attributeList = child.attributes(); for
* (Attribute attr : attributeList) {
* System.out.println(attr.getName() + ": " + attr.getValue());
* }
*/
// 已知属性名情况下
Element child2 = child.element("name");
Attribute attribute = child2.attribute("sex");
System.out.println("sex: " + attribute.getText());
// 未知子元素名情况下
/*
* List<Element> elementList = child.elements(); for (Element
* ele : elementList) { System.out.println(ele.getName() + ": "
* + ele.getText()); } System.out.println();
*/
// 已知子元素名的情况下
System.out.println("name: " + child.elementText("name"));
System.out.println("age: " + child.elementText("age"));
System.out.println("address: " + child.elementText("address"));
System.out.println("nickName: " + child.elementText("nickName"));
// 这行是为了格式化美观而存在
System.out.println();
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long finishTime = System.currentTimeMillis();
long time = finishTime - startTime;
System.out.println("结束解析: " + finishTime + "\nDom4j解析耗时:" + time);
for (Bean1 student : datas) {
System.out.println(student.toString());
}
}
/**
* 遍历当前节点下的所有节点
* @param node
*/
public void listNodes(Element node) {
System.out.println("当前节点的名称:" + node.getName());
// 首先获取当前节点的所有属性节点
List<Attribute> list = node.attributes();
// 遍历属性节点
for (Attribute attribute : list) {
System.out.println("属性" + attribute.getName() + ":" + attribute.getValue());
}
// 如果当前节点内容不为空,则输出
if (!(node.getTextTrim().equals(""))) {
System.out.println(node.getName() + ":" + node.getText());
}
// 同时迭代当前节点下面的所有子节点
// 使用递归
Iterator<Element> iterator = node.elementIterator();
while (iterator.hasNext()) {
Element e = iterator.next();
listNodes(e);
}
}
(3)添加/删除节点
private void addOrRemoveNode() {
try {
// 增加新的节点
System.out.println("增加/删除节点开始");
SAXReader reader = new SAXReader();
Document document = reader.read(xmlFile);
Element root = document.getRootElement();
// 错了,root就是students的节点。
// Element element = root.element("students");
Element studentEl = root.addElement("student001");
Element nameEl = studentEl.addElement("name");
nameEl.addAttribute("sex", "woman");
nameEl.setText("小黄");
Element nickNameEl = studentEl.addElement("nickName");
nickNameEl.setText("阿黄");
Element ageEl = studentEl.addElement("age");
ageEl.setText("28");
Element addEl = studentEl.addElement("address");
addEl.setText("甘肃省兰州市");
// 删除student-0的节点
Element el2remove = root.element("student-0");
Element age2 = el2remove.element("age");
root.remove(el2remove);
writeDocmuent2File(document);
System.out.println("添加/删除节点完成");
} catch (Exception e) {
}
}
(4)添加/删除节点中的某个属性值
private void addOrRemoveAttr() {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(xmlFile);
Element root = document.getRootElement();
// 删除属性
Element student0 = root.element("student-0");
Element name0 = student0.element("name");
Attribute sex0 = name0.attribute("sex");
name0.remove(sex0);
// 添加属性
Element address0 = student0.element("address");
address0.addAttribute("国家", "中国");
writeDocmuent2File(document);
} catch (Exception e) {
}
}
(5) 更新节点的值或属性值
private void updateValue(){
try{
SAXReader reader = new SAXReader();
Document document = reader.read(xmlFile);
Element root = document.getRootElement();
Element student1 = root.element("student-1");
Element name1 = student1.element("name");
Attribute sex1 = name1.attribute("sex");
//下面两句,效果一样。
// sex1.setValue("hahahahah");
sex1.setText("enenenen");
Element address1 = student1.element("address");
address1.setText("芝加哥");
writeDocmuent2File(document);
}catch(Exception e ){}
}
(6)将XML内容写入到文件
private void writeDocmuent2File(Document docment) throws Exception {
// 输出格式
// 紧凑的格式
// OutputFormat format = OutputFormat.createCompactFormat();
// 排版缩进的格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"), format);
writer.write(docment);
writer.flush();
writer.close();
}
demo传送门:
https://github.com/215836017/ParseXML_java
https://github.com/215836017/ParserXML_android
注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。