JDOM方式解析及生成XML文件
前面都说的官方提供的解析及生成XML的方法,下面说一下利用JDOM解析及生成XML文件。JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。要使用JDOM,首先需要下载JDOM相关jar包并导入工程。下载地址:JDOM官网

这里先简单归纳一下JDOM解析XML的步骤:
(1)获取SAXBuilder对象
(2)通过SAXBuilder的buid方法获取Document对象
(3)获取根节点
(4)开始递归解析(递归解析过程和DOM解析如出一辙,不同在于方法名及对象,紧紧围绕树形结构很容易搞定)


生成XML
生成XML的过程每种方法结构都大同小异
(1)创建根节点
(2)创建document对象
(3)循环创建每个子节点
(4)利用XMLOutputter对象生成XML文件
(需要设置XML文件相关属性的话需要在获取XMLOutputter对象的时候传入一个Format对象,format有个基础的getPrettyFormat()方法,可以实现生成的XML文档的格式话处理,有合理缩进,比较实用,当然,用format设置编码等属性依旧是可行的)

话不多说,看代码比较直观。首先,依旧需要用到用于解析测试的XML文件: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>

其次实体类Language: 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
                + "]";
    }
}

最后是测试代码及解析和生成XML的主逻辑:JDOMTest.java
package org.devsong.xmlload;

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

import org.devsong.entity.Language;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class JDomTest {

    private String typedName = "lan";
    private ArrayList list = new ArrayList<>(); // 实体存储列表
    private Language listEle = null; // 实体缓存

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

        test.genXMl();
    }

    /**
     * 获取Document对象
     * 
     * @param uri
     * @return
     */
    private Document getDocment(String uri) {
        // 获取SAXBuilder
        SAXBuilder builder = new SAXBuilder();
        File file = new File(uri);
        Document doc = null;
        try {
            doc = builder.build(new FileInputStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return doc;
    }

    /**
     * 开始解析
     */
    private void startParse() {
        // 获取根节点,从根结点开始解析
        Element ele = getDocment("./src/res/language.xml").getRootElement();
        parseNode(ele);
        list.add(listEle); // 存储最后一个解析的实体

        // 输出list内容,以便查看实体是否存储成功
        System.out.println("\n\n==================list====================");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    /**
     * 节点递归解析
     * 
     * @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.getAttributes();
        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 childList = node.getChildren();
        if (childList != null) {
            for (int i = 0; i < childList.size(); i++) {
                Element child = childList.get(i);
                parseNode(child);
            }
        }
    }

    /**
     * 实体属性存储
     * 
     * @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() {
        // 创建根节点
        Element root = new Element("language");
        // 设置根节点属性
        root.setAttribute("CAT", "IT");
        root.setAttribute("count", list.size() + "");
        // 创建Document对象
        Document doc = new Document(root);
        // 循环生成每个子节点
        for (Language item : list) {
            Element lan = new Element("lan");
            lan.setAttribute("id", item.getId() + "");
            root.addContent(lan); // 生成的子节点加入父类
            if (item.getName() != null) {
                Element name = new Element("name");
                name.addContent(item.getName()); // 设置节点值
                lan.addContent(name);
            }
            if (item.getIDE() != null) {
                Element IDE = new Element("IDE");
                IDE.addContent(item.getIDE());
                lan.addContent(IDE);
            }
            if (item.getNameExt() != null) {
                Element name_ext = new Element("filename_extension");
                name_ext.addContent(item.getNameExt());
                lan.addContent(name_ext);
            }
            if (item.getDescription() != null) {
                Element description = new Element("description");
                description.addContent(item.getDescription());
                lan.addContent(description);
            }
        }

        try {
            // 定制format,利用format对象还可以定制编码等文件属性
            Format format = Format.getPrettyFormat();
            // 传入format对象,构建XMLOutputter对象
            XMLOutputter outputter = new XMLOutputter(format);
            // 生成XML实体文件
            outputter.output(doc, new FileOutputStream(new File("./src/res/language_jdom.xml")));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

运行测试代码,可以得到以下输出结果:
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并且将相关内容存储到了Language实体。打开生成的XML文档对比原文档可以看到生成无误,并且有合理缩进。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门