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专门用于数据传递:

java 处理XML(dom4j-1.6.1)
/***

 * 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;

    }

}
View Code

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

java 处理XML(dom4j-1.6.1)
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);



    }
View Code

创建一个写到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

 

你可能感兴趣的:(dom4j)