您的位置:首页 > 编程语言 > Java开发

java解析XML——dom4j解析

2017-09-03 09:36 337 查看
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文件,内容如下:
<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文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: