您的位置:首页 > 其它

解析xml文件——dom4j

2018-01-15 16:46 323 查看
解析xml文件——简介,在xml文件的4种解析方式中,在不考虑大型文档的前提下DOM4J方式性能最佳,也最容易实现。

xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<root att1="测试" att2="解析xml">
<child att1="a" att2="你">
<subChild att1="b" att2="好">
<node att1="c" att2="2">text1</node>
<node att1="d" att2="0">text2</node>
</subChild>
</child>
<child att1="e" att2="1">
<subChild att1="f" att2="8"></subChild>
</child>
</root>


以上述xml文件为例,用DOM4J方式对其解析,并将解析结果保存到自定义的数据结构中。

需要下载dom4j.jar!!!!!

代码实例:

1. 定义数据结构

/*
定义数据结构,保存解析的xml文件信息
*/
public class XmlFile {

private String att1;     //元素属性att1
private String att2;     //元素属性att2
private String elementText;        //元素文本

public String getAtt1() {
return att1;
}
public void setAtt1(String att1) {
this.att1 = att1;
}

public String getAtt2() {
<
bf82
span class="hljs-keyword">return att2;
}
public void setAtt2(String att2) {
this.att2 = att2;
}

public String getElementText() {
return elementText;
}
public void setElementText(String elementText) {
this.elementText = elementText;
}

}


2.解析xml文件

/*
xmlReadFunction:获取文件路径,调用readNodeFunction函数,返回解析内容
输入:文件路径
返回:文件信息,ArrayList<XmlFile>
readNodeFunction: 递归方法,遍历每个xml元素节点,调用readNode函数,返回解析内容
输入:元素,文件信息,ArrayList<XmlFile>
返回:void
readNode:解析元素节点的属性值和文本内容
输入:元素,文件信息,ArrayList<XmlFile>
返回:void
*/
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class XmlRead {

public ArrayList<XmlFile> xmlReadFunction(String path){
if(path==null || path.length()==0){
System.out.println("请输入文件路径");
return null;
}

ArrayList<XmlFile> infoList = new ArrayList<>();    //用于存储解析得到的xml信息

File file = new File(path);              //读取文件,创建file对象
SAXReader reader = new SAXReader();      //创建一个SAXReader对象

try {
Document document = reader.read(file);      //创建一个Document对象
Element root = document.getRootElement();   //通过Document对象获取根元素节点

readNodeFunction(root, infoList);           //遍历xml元素节点,解析

} catch (DocumentException e) {
e.printStackTrace();
}

return infoList;
}

public void readNodeFunction(Element root, ArrayList<XmlFile> infoList){

if (root != null){
readNode(root, infoList);            //先解析当前元素节点
//迭代当前元素节点的子节点
for(Iterator i = root.elementIterator(); i.hasNext();) {
Element e = (Element) i.next();
readNode(e, infoList);

List<Element> listElement = e.elements();
for(Element ele:listElement){
readNodeFunction(ele, infoList);        //递归
}

}
}
}

public void readNode(Element node, ArrayList<XmlFile> infoList){
if(node != null){

String text = node.getText();    //获取元素节点的文本内容
String att1 = node.attributeValue("att1");   //获取元素节点的属性值att1
String att2 = node.attributeValue("att2");   //获取元素节点的属性值att2

//保存到XmlFile对象中
XmlFile info = new XmlFile();

if(text!=null && !"".equals(text.trim())){
info.setElementText(text);
}

if (att1 != null && !"".equals(att1)){
info.setAtt1(att1);
}

if (att2 != null && !"".equals(att2)){
info.setAtt2(att2);
}
infoList.add(info);
}

}
}


3.main方法

import java.util.ArrayList;

public class Main {

public static void main(String[] args) {
System.out.println("---------read Xml dom4j--------");
XmlRead read = new XmlRead();
ArrayList<XmlFile> infoList = reader.xmlReadFunction("E:\\xmlTest\\new 1.xml");

for (XmlFile info: infoList){
System.out.println("文本: "+info.getElementText()
+", att1: "+info.getAtt1()
+", att2: "+info.getAtt2());
}
}
}


4. 运行结果:

---------read Xml dom4j--------
文本: null, att1: 测试, att2: 解析xml
文本: null, att1: a, att2: 你
文本: null, att1: b, att2: 好
文本: text1, att1: c, att2: 2
文本: text2, att1: d, att2: 0
文本: null, att1: e, att2: 1
文本: null, att1: f, att2: 8


5. 总结:

1). 在方法
readNodeFunction
中,需要先对当前元素节点调用
readNode
方法,否则会漏掉元素,然后获取当前元素节点的子元素,递归。

2). 方法
readNode
主要用于获取元素节点的属性或者文本内容:

如果属性不多,可以通过
elementNode.attributeValue("属性名")
获取指定的属性值,如上所示;

elementNode.getText()
可以获得元素节点的文本内容,由于该xml文件有的元素节点无文本,所以打印结果会有null。

3). 基于2),如果属性很多,且要获取全部属性值,可以通过
List<Attribute> attList =

elementNode.attributes();
获取元素的属性列表,然后遍历该list即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: