解析xml文件——dom4j

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

猜你喜欢

转载自blog.csdn.net/gxx_csdn/article/details/79066250