• 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;
        }
    }
    View Code

    接下来初始化并放到一个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);
    
        }
    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
  • 相关阅读:
    排名第一、第二的OCR软件
    补码输出
    枚举 与 枚举的应用
    动态构造结构体数组
    c 冒泡排序
    strcpy
    typedef用法
    C 结构体小结
    int 占一个机器字长
    SQL Server创建视图——视图的作用
  • 原文地址:https://www.cnblogs.com/tobecrazy/p/4663175.html
Copyright © 2020-2023  润新知