美文网首页
Java 操作Xml文件

Java 操作Xml文件

作者: 两分与桥 | 来源:发表于2018-08-05 18:59 被阅读41次

在eclipse中建立maven项目,会自动生成各个文件夹和配置文件
需要读取xml文件,要导入包 dom4j,在文件pom.xml中配置下面这项,注意,要写在<project></project>标签中间。

<dependencies>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
</dependencies>

读取xml文件,转换为对象保存在内存中

emplist.xml,是需要读取的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <emp id="1">
        <name>one</name>
        <age>22</age>
        <gender>男</gender>
        <salary>1500</salary>
    </emp>
    <emp id="2">
        <name>two</name>
        <age>23</age>
        <gender>男</gender>
        <salary>3000</salary>
    </emp>
    <emp id="3">
        <name>three</name>
        <age>23</age>
        <gender>男</gender>
        <salary>3500</salary>
    </emp>
</list>

将上面xml信息,实例化的实体类

package day12;

 * 该类用于表示xml文档中的一个员工信息
public class Emp {
    private int id;
    private String name;
    private int age;
    private String gender;
    private int salary;
    
    ---- 省略get,set方法
    public Emp() {}

    public Emp(int id, String name, int age, String gender, int salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.salary = salary;
    }

    public String toString() {
        return id+","+name+","+age+","+gender+","+salary;
    }
}

处理程序

package day12;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

 * 使用DOM解析xml文档
public class ParseXmlDemo {
    public static void main(String[] args) {

         * 解析emplist.xml文档,将所有的员工信息读取
         * 出来并转换为若干Emp实例,存入一个List集合中
         * 
         * 解析XML的流程:
         * 1. 创建SAXReader
         * 2. 使用SAXReader读取XML文档并返回Document对象
         *  Document对象
         *  这一步就是DOM解析耗时耗资源的体现
         *  因为DOM会将XML文档全部读取并以一个Document对象形式存于内存。
         *  Document对象用于描述解析的XML文档内容。
         * 3. 根据Document对象获取根元素
         * 4. 按照xml的结构从根元素中开始逐级获取子元素以达到遍历xml的目的
        
        try {
             * 1
            SAXReader reader = new SAXReader();
             * 2
            Document doc = reader.read(new FileInputStream("emplist.xml"));

             * 3. 获取根元素
             * Element的每一个实例用于表示xml文档中的一个元素(一个标签)
             * 这里获取的相当于emplist.xml文档中的<List>标签
             *
             *Element提供了获取元素的相关方法:
             *
             *String getName()  --获取当前标签的名字
             *List elements()   --获取当前标签下的所有子标签
             *List element(String name)    --获取当前标签下所有同名子标签
             *Element element(String name) --获取指定名字的子标签
             *Attribute attribute(String name) --获取指定名字的属性,getName(),getValue()
             *
             *String getText()  --获取当前标签中的文本
             *(前标签和后标签中间的文本信息,前提是确实为文本而不是子标签)     

            Element root = doc.getRootElement();
            List<Emp> emplist = new ArrayList<Emp>();
            
            // 获取根标签<list>下面的所有子标签<emp>
            List<Element> elements = root.elements();
            

             * 遍历所有<Emp>标签并解析出该员工相关信息并以一个Emp实例
             * 保存然后将其存入emplist集合

            for(Element empEle: elements) {
                int id = Integer.parseInt(empEle.attribute("id").getValue());
                String name = empEle.elementText("name");
                int age = Integer.parseInt(empEle.elementText("age"));
                String gender = empEle.elementText("gender");
                int salary = Integer.parseInt(empEle.elementText("salary"));
                
                Emp emp = new Emp(id,name,age,gender,salary);
                emplist.add(emp);
            }
            
            System.out.println("解析完毕");
            System.out.println("共有"+emplist.size()+"个员工");
            for(Emp e:emplist) {
                System.out.println(e);
            }
            System.out.println(emplist);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

打印结果:
解析完毕
共有3个员工
1,one,22,男,1500
2,two,23,男,3000
3,three,23,男,3500
[1,one,22,男,1500, 2,two,23,男,3000, 3,three,23,男,3500]

将对象转换为xml文件

要注意把Emp类放在同一个包下

package day12;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

 * 使用DOM生成xml文档
public class WriteXmlDemo {
    public static void main(String[] args) {
        List<Emp> emplist = new ArrayList<Emp>();
        emplist.add(new Emp(1,"one",22,"男",1200));
        emplist.add(new Emp(2,"two",23,"男",2400));
        emplist.add(new Emp(3,"three",24,"男",4800));
        emplist.add(new Emp(4,"four",25,"男",9600));
        emplist.add(new Emp(5,"five",26,"男",19200));
        
         * 将emplist集合中的员工信息保存到myemp.xml文档中。

         * 写出XML文档的步骤:
         * 1. 创建一个Document对象表示一个空白的xml文档
         * 2. 向Document对象中添加根元素
         * 3. 按照应当生成的xml文档的格式逐级向根元素中添加子元素以形成xml文档格式
         * 4. 创建XmlWriter
         * 5. 通过XmlWriter将Document写出

        XMLWriter writer = null;
        try {
            Document document = DocumentHelper.createDocument();

             * 添加根标签<list>
             * Document提供了根元素的方法
             * 
             * Element addElement(String name)
             * 该方法可以向当前文档中添加给定名字的根元素,并将添加进入的
             * 元素以一个Element实例返回,以便于对该元素继续操作。
             * 需要注意,该方法只能调用一次,因为一个文档中的根元素只能有一个。

            Element root = document.addElement("list");
            
            for(Emp emp:emplist) {
                 * Element addElement(String name)
                 * 向当前标签中添加给定名字的子标签并将其返回,以便继续操作
                 * 
                 * Element addText(String text)
                 * 向当前标签中添加文本信息,返回值为当前文档标签
                 * 
                 * Element addAttribute(String name,String value)
                 * 向当前标签中添加属性,返回值为当前标签

                Element empEle = root.addElement("emp");
                empEle.addAttribute("id", String.valueOf(emp.getId()));
                empEle.addElement("name").addText(emp.getName());
                empEle.addElement("gender").addText(emp.getGender());
                empEle.addElement("salary").addText(String.valueOf(emp.getSalary()));
            }
            
            FileOutputStream fos = new FileOutputStream("myemp.xml");
            writer = new XMLWriter(fos,OutputFormat.createPrettyPrint());
            * OutputFormat.createPrettyPrint() 
            * 不加这句输出结果是在一行显示的,加上会格式化写入,也就是有缩进的代码模式
            writer.write(document);
            System.out.println("写出完毕!");
            
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if(writer != null) {
                try {
                    writer.close();
                    System.out.println("关闭文件流");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
打印结果:
写出完毕!
关闭文件流

最终输出的myemp.xml文件

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

<list>
    <emp id="1">
        <name>one</name>
        <gender>男</gender>
        <salary>1200</salary>
    </emp>
    <emp id="2">
        <name>two</name>
        <gender>男</gender>
        <salary>2400</salary>
    </emp>
    <emp id="3">
        <name>three</name>
        <gender>男</gender>
        <salary>4800</salary>
    </emp>
    <emp id="4">
        <name>four</name>
        <gender>男</gender>
        <salary>9600</salary>
    </emp>
    <emp id="5">
        <name>five</name>
        <gender>男</gender>
        <salary>19200</salary>
    </emp>
</list>

java Xpath 的使用

记得在maven中引入包 jaxen,添加如下

<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1.6</version>
</dependency>

使用Xpath检索XML数据

package day12;

import java.io.FileInputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

 * 使用Xpath检索XML数据
public class XpathDemo {
    public static void main(String[] args) {
        try {
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new FileInputStream("myemp.xml"));

             * Document支持使用xpath检索数据,前提是必须引入jaxen这个jar

            String xpath = "/list/emp[gender='男']/name";
            List<Element> list = doc.selectNodes(xpath);
            for(Element ele:list) {
                System.out.println(ele.getName()+":"+ele.getText());
            }
        }catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

相关文章

网友评论

      本文标题:Java 操作Xml文件

      本文链接:https://www.haomeiwen.com/subject/kuzbvftx.html