继解析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() {
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 =
获取元素的属性列表,然后遍历该list即可。
elementNode.attributes();