java 处理XML(dom4j-1.6.1)

java 处理XML(dom4j-1.6.1)



Java 处理xml有很多框架,今天使用主流框架dom4j-1.6.1

下载地址:http://www.dom4j.org/dom4j-1.6.1/

Dom4j,是一款开源的处理XML, XPath, and XSLT的框架,它容易使用,并且完全支持DOM, SAX, and JAXP.


写XML 文件

  • 首先创建一个XMLwriter,吧文件写到output.xml
 // lets write to a file
        XMLWriter writer = new XMLWriter(
            new FileWriter( "output.xml" )
        );
  • 创建一个xml Document
Document document = DocumentHelper.createDocument();
  • 接着创建 元素的根节点
Element root = document.addElement( "root" );
  • 接下来在根节点添加元素和属性
 root.addElement( "author" )
            .addAttribute( "name", "James" )
            .addAttribute( "location", "UK" )
            .addText( "James Strachan" );
  • 最后保存文件
     writer.write( document );
        writer.close();
  • 这样保存效果很差,很不美观,如果想要漂亮的效果
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"), format);

最终的:

import java.io.FileWriter;
import java.io.IOException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class XMLWriterTest {
    /**
     * @author Young
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileWriter("output.xml"), format);

        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("root");

        root.addComment("This is xml comment");
        root.addElement("author").addAttribute("name", "James")
                .addAttribute("location", "UK").addText("James Strachan");
        writer.write(document);
        writer.close();
    }
}

输出效果如下:

<?xml version="1.0" encoding="UTF-8"?>

<root>
  <!--This is xml comment-->
  <author name="James" location="UK">James Strachan</author>
</root>

嵌套写XML

想要的效果如下:

<?xml version="1.0" encoding="UTF-8"?>

<StudentInfo Class="1">
  <!--This is Class 1 student information-->
  <student name="Jack" Sex="Male" Birthday="1988/07/05">100001
    <scores score="90"/>
  </student>
  <student name="Lisa" Sex="Female" Birthday="1989/02/12">100002
    <scores score="98"/>
  </student>
  <student name="Steven" Sex="Male" Birthday="1987/11/18">100003
    <scores score="59"/>
  </student>
  <student name="Jenny" Sex="Female" Birthday="1989/03/18">100004
    <scores score="69"/>
  </student>
  <student name="Lucy" Sex="Female" Birthday="1990/01/26">100005
    <scores score="90"/>
  </student>
  <student name="Lewis" Sex="Male" Birthday="1989/04/06">100006
    <scores score="82"/>
  </student>
</StudentInfo>

每个student节点下设置一个score节点

并且所有student节点属性都一样,于是乎可以创建一个student bean专门用于数据传递:

/***
 * This Class is for Student bean
 * @author Young
 *
 */
public class Student {

    private int stud_Id;
    private String stud_Name;
    private String sex;
    private String birthday;
    private String score;

    public int getStud_Id() {
        return stud_Id;
    }

    public void setStud_Id(int stud_Id) {
        this.stud_Id = stud_Id;
    }

    public String getStud_Name() {
        return stud_Name;
    }

    public void setStud_Name(String stud_Name) {
        this.stud_Name = stud_Name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }

    /**
     * This method is a constructor
     *
     * @author Young
     * @param id
     * @param name
     * @param sex
     * @param birthday
     * @param score
     */
    public Student(int id, String name, String sex, String birthday,
            String score) {

        this.stud_Id = id;
        this.stud_Name = name;
        this.sex = sex;
        this.birthday = birthday;
        this.score = score;
    }
}

接下来初始化并放到一个ArrayList:

static List<Student> students = new ArrayList<Student>();

    /**
     * @author Young
     */
    public static void init() {
        Student stu1 = new Student(100001, "Jack", "Male", "1988/07/05", "90");
        Student stu2 = new Student(100002, "Lisa", "Female", "1989/02/12", "98");
        Student stu3 = new Student(100003, "Steven", "Male", "1987/11/18", "59");
        Student stu4 = new Student(100004, "Jenny", "Female", "1989/03/18",
                "69");
        Student stu5 = new Student(100005, "Lucy", "Female", "1990/01/26", "90");
        Student stu6 = new Student(100006, "Lewis", "Male", "1989/04/06", "82");
        students.add(stu1);
        students.add(stu2);
        students.add(stu3);
        students.add(stu4);
        students.add(stu5);
        students.add(stu6);

    }

创建一个写到XML文件的方法:

/**
     * @author Young
     * @param studs
     * @return
     * @throws IOException
     */
    public static Document createDocument(List<Student> studs)
            throws IOException {

        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileWriter("output.xml"), format);

        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("StudentInfo");

        root.addAttribute("Class", "1");
        root.addComment("This is Class 1 student information");

        for (Student std : studs) {
            root.addElement("student").addAttribute("name", std.getStud_Name())
                    .addAttribute("Sex", std.getSex())
                    .addAttribute("Birthday", std.getBirthday())
                    .addText(Integer.toString(std.getStud_Id()))
                    .addElement("scores").addAttribute("score", std.getScore());
        }
        writer.write(document);
        writer.close();
        return document;
    }

读取XML文件

  • 与写文件相似,首先创建一个SAXReader
SAXReader reader = new SAXReader()
  • 接着创建XML document
Document document = reader.read(file);
  • 创建根元素并从document获取
 Element root = document.getRootElement();
  • 创建元素迭代器或属性迭代器获取相关元素和属性
  // iterate through child elements of root
        for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
            Element element = (Element) i.next();
            // do something
        }
  // iterate through attributes of root
        for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
            Attribute attribute = (Attribute) i.next();
            // do something
        }

以之前嵌套后的XML为例:

/**This method is for read XML
     * @author Young
     * @param file
     * @throws DocumentException
     */
    public static void readDocument(String file) throws DocumentException {
        SAXReader reader = new SAXReader();

        Document document = reader.read(file);

        Element root = document.getRootElement();
        for (Iterator<?> i = root.elementIterator(); i.hasNext();) {
            Element element = (Element) i.next();
            if (!element.getName().equalsIgnoreCase("Student")) {
                System.out.println("StudentInfo is:");
                continue;
            }

            // iterate through child elements of root with element name
            // "student"

            for (Iterator<?> j = element.attributeIterator(); j.hasNext();) {
                Attribute attribute = (Attribute) j.next();
                System.out.print("attribute name " + attribute.getName()
                        + " ->" + attribute.getName());
                System.out.println(" attribute value " + attribute.getValue());

            }
            System.out.println("attribute value " + element.getText());
            // get path
            System.out.println("attribute name " + element.getName() + " ->"
                    + element.getPath());

        }

    }

可以通过:

getName/getPath/getValue 等方法是获取相关内容

运行结果:

attribute name name ->name attribute value Jack
attribute name Sex ->Sex attribute value Male
attribute name Birthday ->Birthday attribute value 1988/07/05
attribute value 100001

attribute name student ->/StudentInfo/student
attribute name name ->name attribute value Lisa
attribute name Sex ->Sex attribute value Female
attribute name Birthday ->Birthday attribute value 1989/02/12
attribute value 100002

attribute name student ->/StudentInfo/student
attribute name name ->name attribute value Steven
attribute name Sex ->Sex attribute value Male
attribute name Birthday ->Birthday attribute value 1987/11/18
attribute value 100003

attribute name student ->/StudentInfo/student
attribute name name ->name attribute value Jenny
attribute name Sex ->Sex attribute value Female
attribute name Birthday ->Birthday attribute value 1989/03/18
attribute value 100004

attribute name student ->/StudentInfo/student
attribute name name ->name attribute value Lucy
attribute name Sex ->Sex attribute value Female
attribute name Birthday ->Birthday attribute value 1990/01/26
attribute value 100005

attribute name student ->/StudentInfo/student
attribute name name ->name attribute value Lewis
attribute name Sex ->Sex attribute value Male
attribute name Birthday ->Birthday attribute value 1989/04/06
attribute value 100006

attribute name student ->/StudentInfo/student
时间: 2024-10-06 00:45:46

java 处理XML(dom4j-1.6.1)的相关文章

转:在java中使用dom4j解析xml

在java中使用dom4j解析xml 虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: <?xml version="1.0" encod

Java解析XML之Dom4j

Java解析XML文件的方法有多种,个人感觉最常用的是使用Dom4j来解析XML文件.下面就简单介绍下Dom4j的基础使用. Dom4j需要jar包的支持,大家可以从网络上下载,如dom4j-1.6.1.jar: 下载好JAR包以后,只要导入我们的工程就可以使用了,Java WEB工程导入路径为:WebRoot/WEB-INF/lib目录下: 代码示例: 一.查看xml文档基础操作(以封装方法展示): public static void run() throws Exception { //获

java学习之dom4j 对 xml的读取

在BS中已经学习了关于XML的知识,但是一直对于XML的理解是"不重要","有没有都可以".但是在没有xml的日子里,程序员想进行进程间数据传递,必须自己设计传输接口,里面牵涉到很多烦人的数据格式等问题,使得程序员不能专注于具体业务的解决.如今xml和各种语言对xml的支持包,把程序员解脱出来了. 了解了XML再来说说关于dom4j的知识吧.dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML AP

Java操作XML文件 dom4j 篇

在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互.今天就来讲一下Java 中使用dom4j来操作XML文件. 我们需要引入的包: //文件包 import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; //工具包 import java.util.Iterator; import java.util.List; //dom4j包 import org.dom

Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath [引言] 目前在Java中用于解析XML的技术很多,主流的有DOM.SAX.JDOM.DOM4j,下文主要介绍这4种解析XML文档技术的使用.优缺点及性能测试. 一.[基础知识——扫盲] sax.dom是两种对xml文档进行解析的方法(

Java读写xml文件的一些经验(使用dom4j)

说来惭愧,给很多人说过怎么用Java读写xml,但是自己上手做的很少.这篇博客里面简单总结一下. 据网上很多文章介绍,dom4j是一种常用的xml读写API.不过用的时候首先要注意第一个问题:如果在Bing.com里搜索dom4j,排在第一名的是:http://www.dom4j.org/ 很遗憾,这个域名和dom4j没有任何关系,其在Sourceforge上的主页是:http://sourceforge.net/projects/dom4j/ ,我这里下载的是稳定版,将dom4j-1.6.1.

java中利用dom4j解析XML文件

官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回List<Student>集合 需要解析的XML: <?xml version="1.0" encoding="UTF-8"?> <classes> <class name="ST01"> <stud

XML —— Java 操作 XML 工具包( JDOM&amp;DOM4J )

1. JDOM 引入 JDOM 是一种使用 XML(标准通用标记语言下的一个子集) 的独特 Java 工具包,用于快速开发 XML 应用 程序. 集合DOM 和 SAX 的优点 需要引入jar包 JDOM 官方网站:http://www.jdom.org/ 小缺陷:生成文档不会格式化,需要手动格式化 ( ctrl+shift+F) import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.

Java 解析XML的几种方式:DOM、SAX、JDOM和DOM4J。

归纳总结Java解析XML主要有四中方式,分别是DOM.SAX.JDOM和DOM4J.其中DOM和SAX是官方包自带,另外两个JDOM和DOM4J是第三方包. 一.此篇测试代码用到的XML情况 . 1.XML内容展示 1 <?xml version="1.0" encoding="UTF-8"?> 2 <class> 3 <people> 4 <name>Jack</name> 5 <age>1

Java生成XML文件

<Java眼中的XML ---文件写入> 四种方法用Java生成一个XML文件. 1.通过DOM方式生成XML文档 import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transfo