DOM4j方式解析及生成XML文件
DOM4j是一个Java操作XML的额API,可以理解为JDOM的升级版,操作简便,性能优异。同JDOM一样,DOM4j也是一个开源项目。要使用其操作XML文件,同样需要下载并导入相关jar包。可以在github下载:DOM4j   

准备工作完成,接下来简单归纳一下操作步骤:
解析XML:
(1)获取SAXReader对象
(2)利用Reader获取Document对象
(3)获取根节点并进行递归解析


生成XML:
(1)利用DocumentHelper的静态方法创建Document实例
(2)创建根节点, 向document中添加一个节点,addlement会返回添加的节点对象
(3)循环创建每一个节点  
(4)创建一个XMLwriter对象(可以在此之前创建一个OutputFormat对象对XML进行属性设置,包括编码、缩进、换行等)
(5)进行文件写出操作
(6)关闭XMLWriter


看了步骤是不是有种感觉:与前面几种的方法类似?没错,套路都是一样的!码起代码更是有这种感觉,话不多说,看示例:
首先依旧是Launguage待解析文件:language.xml
< xml version="1.0" encoding="utf-8" >
<language cat="IT" count="3">
    <lan id="1">
        <name>Java</name>
        <IDE>eclipse</IDE>
        <filename_extension>.java</filename_extension>
    </lan>
    <lan id="2">
        <name>C++</name>
        <IDE>Cline</IDE>
        <filename_extension>.cpp</filename_extension>
    </lan>
    <lan id="3">
        <name>PHP</name>
        <IDE>PhpStorm</IDE>
        <filename_extension>.php</filename_extension>
        <description>the best language in the world.. </description>
    </lan>
</language>

其次是Launguage实体类:Language.java
package org.devsong.entity;

public class Language {
    private String name;
    private long id;
    private String IDE;
    private String nameExt;
    private String description;

    public Language() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getIDE() {
        return IDE;
    }

    public void setIDE(String iDE) {
        IDE = iDE;
    }

    public String getNameExt() {
        return nameExt;
    }

    public void setNameExt(String nameExt) {
        this.nameExt = nameExt;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Language [name=" + name + ", id=" + id + ", IDE=" + IDE + ", nameExt=" + nameExt + ", description=" + description
                + "]";
    }
}

下面是测试代码及操作逻辑:Dom4jTest.java
package org.devsong.xmlload;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.devsong.entity.Language;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jTest {

    private String typedName = "lan";
    private ArrayList list = new ArrayList<>();     //实体存储列表
    private Language listEle = null;     //实体个体缓存
    
    /**
     * 开始解析
     */
    private void startParse() {
        //获取SAXReader对象
        SAXReader reader = new SAXReader();
        try {
            //利用Reader获取Document对象
            Document doc = reader.read(new File("src/res/language.xml"));
            //获取根节点并进行递归解析
            parseNode(doc.getRootElement());
            //解析完成后存储最后一个未存储的解析结果
            list.add(listEle);
            
            //输出列表内容以便观察实体存储情况
            System.out.println("\n\n=====================list====================");
            for(Language lan : list) {
                System.out.println(lan);
            }

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

    /**
     * 递归解析节点
     * @param node
     */
    private void parseNode(Element node) {
        if(node.getName().equals(typedName)) {
            System.out.println();
            if(listEle != null) {    //若listEle不为空则存储
                list.add(listEle);
            }
            listEle = new Language();
        }
        System.out.print(node.getName() + ":");
        //获取当前节点属性列表
        List attrlist = node.attributes();
        if (attrlist != null) {
            for (int i = 0; i < attrlist.size(); i++) {
                Attribute attr = attrlist.get(i);
                System.out.print("[attr]" + attr.getName() + ":" + attr.getValue() + "   ");
                //若当前节点等于分类节点,且当前属性名为:id 则将属性存储到实体
                if(node.getName().equals(typedName) && attr.getName().equals("id")) {
                    listEle.setId(Long.parseLong(attr.getValue()));
                }
            }
        }

        //剔除空白文本
        //输出节点内容
        if(node.getText() != null && !node.getText().trim().equals("")) {
            System.out.print(node.getText() + "   ");
            store(node.getName(), node.getText());
        }

        //获取所有的子节点进行递归操作
        List eleList = node.elements();
        if (eleList != null) {
            for (Element e : eleList) {
                parseNode(e);
            }
        }
    }
    
    /**
     * 实体属性存储
     * @param name
     * @param value
     */
    private void store(String name, String value) {
        if (name.equals("name")) {
            listEle.setName(value);
        } else if (name.equals("IDE")) {
            listEle.setIDE(value);
        } else if (name.equals("filename_extension")) {
            listEle.setNameExt(value);
        } else if (name.equals("description")) {
            listEle.setDescription(value);
        }
    }
    
    /**
     * 生成XML文件
     */
    private void genXML() {
        //利用DocumentHelper的静态方法创建Document实例
        Document doc = DocumentHelper.createDocument();
        //向document中添加一个节点,addlement会返回添加的节点对象
        Element root = doc.addElement("language");
        //为根节点添加属性
        root.addAttribute("CAT", "IT");
        root.addAttribute("count", list.size()+"");
        //循环创建每一个节点  
        for(Language item : list) {
            Element lan = root.addElement("lan");
            lan.addAttribute("id", item.getId()+"");
            if(item.getName() != null) {
                Element name = lan.addElement("name");
                name.setText(item.getName());     //设置节点值
            }
            if(item.getIDE() != null) {
                Element IDE = lan.addElement("IDE");
                IDE.setText(item.getIDE());
            }
            if(item.getNameExt() != null) {
                Element name_ext = lan.addElement("filename_extension");
                name_ext.setText(item.getNameExt());
            }
            if(item.getDescription() != null) {
                Element description = lan.addElement("description");
                description.setText(item.getDescription());
            }
        }
        
        try {
            //创建一个OutputFormat对象对XML进行格式化操作
            OutputFormat format = OutputFormat.createPrettyPrint();
            //创建一个XMLwriter对象
            XMLWriter writer = new XMLWriter(new FileOutputStream(new File("./src/res/language_dom4j.xml")), format);
            //进行文件写出操作
            writer.write(doc);
            //关闭XMLWriter对象
            writer.close();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Dom4jTest test = new Dom4jTest();
        test.startParse();
        test.genXML();
    }

}

运行程序,输出结果如下:
language:[attr]cat:IT   [attr]count:3   
lan:[attr]id:1   name:Java   IDE:eclipse   filename_extension:.java   
lan:[attr]id:2   name:C++   IDE:Cline   filename_extension:.cpp   
lan:[attr]id:3   name:PHP   IDE:PhpStorm   filename_extension:.php   description:the best language in the world..    

=====================list====================
Language [name=Java, id=1, IDE=eclipse, nameExt=.java, description=null]
Language [name=C++, id=2, IDE=Cline, nameExt=.cpp, description=null]
Language [name=PHP, id=3, IDE=PhpStorm, nameExt=.php, description=the best language in the world.. ]
观察结果可以明确解析无误且存储无误,打开新建的XML对比原XML可知生成无误,且生成的XML同样有合理地缩进。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门