XML读写之JDOM

  本文先使用JDOM方式写一个简单地小例子,亲测可以运行,然后在末尾分析其优缺点。
  我们知道,DOM的设计为了适用于不同的语言,它保留了不同语言中非常相似的API。但是它并不适合于Java编程者的习惯。而JDOM作为一种轻量级API被制定,它最核心的要求是以Java为中心,只适合于Java语言,它遵循DOM的接口主要规则,除去了DOM中为了兼容各语言而与Java习惯的不同。

1.准备

  • 新建一个Java Project
  • 新建一个Java类名称为JDOMTest.java
  • 新建一个xml文件,名称为student.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <student id="1">
        <name>张三</name>
        <age>18</age>
        <gender>male</gender>
    </student>
    <student id="2">
        <name>李四</name>
        <age>19</age>
        <gender>male</gender>
    </student>
    <student id="3">
        <name>王五</name>
        <age>21</age>
        <gender>female</gender>
    </student>
</root>
  • 由于是Maven工程,所有xml都存放在src/main/resources下面
  • 引入JDOM的jar包到pom.xml
<dependency>
            <groupId>jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>1.0</version>
        </dependency>

2.编码

  • Bean文件:StudentBean.java
public class StudentBean {
    private String id;
    private String name;
    private String gender;
    private Integer age;

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "StudentBean [id=" + id + ",name=" + name + ",gender=" + gender + ",age=" + age + "]";
    }

}
  • XML读写类:JDOMTest.java
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import bean.StudentBean;

public class JDOMTest {

    public static List<StudentBean> studentsList = new ArrayList<StudentBean>();

    public static void main(String[] args) {
        //遍历XML文件中的对象
        List<StudentBean> list = visitXML();
        Iterator<StudentBean> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        updateXML("src/main/resources/student.xml");
        writeXMLFile("src/main/resources/jdom.xml");
    }

    public static List<StudentBean> visitXML() {
        try {
            SAXBuilder builder = new SAXBuilder(false);
            Document document = builder.build("src/main/resources/student.xml");
            //获取根元素
            Element root = document.getRootElement();
            List<Element> students = root.getChildren("student");
            System.out.println("XML文档中共有"+students.size()+"个学生对象!");
            for(Iterator<Element> it = students.iterator();it.hasNext();) {
                Element student = it.next();
                StudentBean stu = new StudentBean();
                stu.setId(student.getAttributeValue("id"));
                stu.setName(student.getChild("name").getText());
                stu.setAge(Integer.parseInt(student.getChildText("age")));
                stu.setGender(student.getChildText("gender"));
                studentsList.add(stu);
                stu = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return studentsList;
    }

    public static void updateXML(String fileName) {
        try {
            SAXBuilder builder = new SAXBuilder(false);
            Document document = builder.build(fileName);
            //获取根元素
            Element root = document.getRootElement();
            List<Element> students = root.getChildren("student");
            //充值元素值
            students.get(1).getChild("name").setText("mason");
            //移除元素
            students.get(0).removeChild("gender");
            //新增元素
            Element phone = new Element("phone");
            phone.setText("15555555");
            students.get(0).addContent(phone);
            XMLOutputter outputter=new XMLOutputter();
            outputter.output(document,new FileOutputStream(fileName));
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("XML文档更改成功!");
    }

    public static void writeXMLFile(String fileName) {
        //创建根节点
        Element root = new Element("fruit");
        //添加第一个元素apple
        Element apple = new Element("apple");
        Element color = new Element("color");
        color.setText("red");
        Element price = new Element("price");
        price.setText("12.2");
        apple.addContent(color);
        apple.addContent(price);
        root.addContent(apple);
        //添加第二个元素apple
        Element apple2 = new Element("apple");
        Element color2 = new Element("color");
        color2.setText("green");
        Element price2 = new Element("price");
        price2.setText("10.88");
        apple2.addContent(color2);
        apple2.addContent(price2);
        root.addContent(apple2);
        //添加第三个元素orange
        Element orange = new Element("orange");
        Element color3 = new Element("color");
        color3.setText("yellow");
        Element price3 = new Element("price");
        price3.setText("3.33");
        orange.addContent(color3);
        orange.addContent(price3);
        root.addContent(orange);
        //写入到新的XML文件中
        try {
            //将根节点添加到文档中
            Document document = new Document(root);
            XMLOutputter XMLOut = new XMLOutputter(FormatXML());
            XMLOut.output(document,new FileOutputStream("src/main/resources/jdom.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("XML文档写入成功!");
    }

    public static Format FormatXML(){  
        //格式化生成的xml文件,如果不进行格式化的话,生成的xml文件将会是很长的一行... 
        Format format = Format.getCompactFormat();  
        format.setEncoding("utf-8");  
        format.setIndent(" ");  
        return format;  
    } 

}

3.运行结果

  程序修改后的student.xml为:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <student id="1">
        <name>张三</name>
        <age>18</age>

    <phone>15555555</phone></student>
    <student id="2">
        <name>mason</name>
        <age>19</age>
        <gender>male</gender>
    </student>
    <student id="3">
        <name>王五</name>
        <age>21</age>
        <gender>female</gender>
    </student>
</root>

  程序自行新建的XML文件jdom.xml为:

<?xml version="1.0" encoding="utf-8"?>
<fruit>
 <apple>
  <color>red</color>
  <price>12.2</price>
 </apple>
 <apple>
  <color>green</color>
  <price>10.88</price>
 </apple>
 <orange>
  <color>yellow</color>
  <price>3.33</price>
 </orange>
</fruit>

4.结束

  优点
1.是基于树的处理XML的Java API,把树加载在内存中
2.没有向下兼容的限制,因此比DOM简单
3.速度快,缺陷少
4.具有SAX的JAVA规则
  缺点:
1.不能处理大于内存的文档
2.JDOM表示XML文档逻辑模型。不能保证每个字节真正变换。
3.针对实例文档不提供DTD与模式的任何实际模型。
4.不支持与DOM中相应遍历包
  适用场景: JDOM具有树的便利性,也有SAX的JAVA规则。在需要平衡时使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇