美文网首页
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