JAVA对XML文件的读写(有具体的代码和解析)

来源:互联网 发布:同花顺期货模拟软件 编辑:程序博客网 时间:2024/05/16 08:24

XML 指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具,应用于 web 开发的许多方面,常用于简化数据的存储和共享。

xml指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
以下为例:

进入主题了

首先要有一个xml文件为名字为emplist.xml内容如下

<?xml version="1.0" encoding="UTF-8"?><list>    <emp id="">        <name>张三</name>        <age></age>        <gender></gender>    <salary>5000</salary>    </emp></list>

XML解析方式

SAX解析方式

SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析。 其优缺点分别为:
优点: 解析可以立即开始,速度快,没有内存压力
缺点: 不能对节点做修改

DOM解析方式

DOM:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。DOM解析器在解析XML文档时,会把文档中
的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。其优缺点分别为:
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点: 如果文件比较大,内存有压力,解析的时间会比较长

SAXReader读取XML文档

使用SAXReader需要导入dom4j-full.jar包。其是DOM4J的一个核心API,用于读取XML文档。
DOM4J是一个Java的XML API,类似于JDOM,用来读写XML文件的。DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强
大和极端易用使用的特点,同时它也是一个开放源代码的软件。

package day12;import java.io.File;import java.util.ArrayList;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * 使用DOM解析xml文档 * @author ylg * */public class ParseXmlDemo {    public static void main(String[] args) {        try {            /*             * 解析XML大致流程             * 1:创建SAXReader             * 2:使用SAXReader读取数据源(xml文档信息)             *   并生成一个Document对象,该对象即表示             *   xml文档内容。DOM耗时耗内存资源也是在             *   这一步体现的。因为会对整个XML文档进行             *   读取并载入内存。             * 3:通过Document对象获取根元素             * 4:根据XML文档结构从根元素开始逐层获取             *   子元素最终以达到遍历XML文档内容的目的             *             */            //1            SAXReader reader = new SAXReader();            //2            Document doc             = reader.read(new File("emplist.xml"));            /*             * 3             * Document提供了方法:             * Element getRootElement()             * 该方法是用来获取XML文档中的根元素,             * 对于emplist.xml文档而言,根元素就是             * <list>标签。             *             * Element类             * 每一个Element实例都可以表示XML文档中的             * 一个元素,即:一对标签。             */            Element root = doc.getRootElement();            /*             * Element提供了方法:             * String getName()             * 该方法可以获取当前元素的名字(标签名)             */            System.out.println(                "获取了根元素:"+root.getName()            );            //4            /*             * 获取一个元素中的子元素             * Element提供了相关方法:             *             * 1             * Element element(String name)             * 获取当前元素下指定名字的子元素。             *             * 2:             * List elements()             * 获取当前元素下所有子元素             *             * 3:             * List elements(String name)             * 获取当前元素下所有同名子元素             *             * 2,3返回的集合中的每一个元素都是Element             * 的实例,每个实例表示其中的一个子元素。             *             */            //获取所有emp标签            List<Element> list = root.elements();            //用于保存所有员工信息的List集合            List<Emp> empList = new ArrayList<Emp>();            for(Element empEle : list){//              System.out.println(empEle.getName());                //获取员工名字                Element nameEle = empEle.element("name");                /*                 * Element还提供了获取当前元素中文本的方法:                 * String getText(),String getTextTrim()                 */                String name = nameEle.getText();                System.out.println("name:"+name);                //获取员工年龄                int age = Integer.parseInt(                    empEle.elementText("age")                );                //获取性别                String gender = empEle.elementText("gender");                //获取工资                int salary = Integer.parseInt(                    empEle.elementText("salary")                );                /*                 * Attribute attribute(String name)                 * 获取当前元素(标签)中指定名字的属性                 *                 * Attribute的每一个实例用于表示一个                 * 属性。其中常用方法:                 * String getName():获取属性名                 * String getValue():获取属性值                 */                Attribute attr                    = empEle.attribute("id");                int id = Integer.parseInt(                    attr.getValue()                );                Emp emp = new Emp(id,name,age,gender,salary);                empList.add(emp);            }            System.out.println("解析完毕!");            for(Emp emp : empList){                System.out.println(emp);            }        } catch (Exception e) {            e.printStackTrace();        }    }}

写XML

构建Document对象
使用DOM4J我们还可以通过自行构建Document对象,并组建树状结构来描述一个XML文档,并使用DOM4J将其写入一个文件。

import java.io.FileOutputStream;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文档 * @author ylg * */public class WriteXmlDemo {    public static void main(String[] args) {        List<Emp> list = new ArrayList<Emp>();        list.add(new Emp(1,"张三",25,"男",5000));        list.add(new Emp(2,"李四",26,"女",6000));        list.add(new Emp(3,"王五",27,"男",7000));        list.add(new Emp(4,"赵六",28,"女",8000));        list.add(new Emp(5,"钱七",29,"男",9000));        /*         * 使用DOM生成XML文档的大致步骤:         * 1:创建一个Document对象表示一个空文档         * 2:向Document中添加根元素         * 3:按照文档应有的结构从根元素开始顺序添加         *   子元素来形成该文档结构。         * 4:创建XmlWriter对象         * 5:将Document对象写出         *   若写入到文件中则形成一个xml文件         *   也可以写出到网络中作为传输数据使用           */        //1        Document doc             = DocumentHelper.createDocument();        /*         * 2         * Document提供了添加根元素的方法:         * Element addElement(String name)         * 向当前文档中添加指定名字的根元素,返回         * 的Element就表示这个根元素。         * 需要注意,该方法只能调用一次,因为一个         * 文档只能有一个根元素。         */        Element root = doc.addElement("list");        //3        for(Emp emp : list){            /*             * Element也提供了追加子元素的方法:             * Element addElement(String name)             * 调用次数没有限制,元素可以包含若干             * 子元素。             */            Element empEle = root.addElement("emp");            //添加name信息            Element nameEle = empEle.addElement("name");            nameEle.addText(emp.getName());            //添加age信息            Element ageEle = empEle.addElement("age");            ageEle.addText(emp.getAge()+"");            //添加gender信息            Element genderEle = empEle.addElement("gender");            genderEle.addText(emp.getGender());            //添加salary信息            Element salEle = empEle.addElement("salary");            salEle.addText(emp.getSalary()+"");            /*             * 向当前元素中添加指定名字以及对应值的属性             */            empEle.addAttribute("id", emp.getId()+"");        }        try{            //4            XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());            FileOutputStream fos                = new FileOutputStream("myemp.xml");            writer.setOutputStream(fos);            //5            writer.write(doc);            System.out.println("写出完毕!");            writer.close();        }catch(Exception e){            e.printStackTrace();        }    }}

注意事项:

XPath 路径表达式
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。由于我们单纯使用dom定位节点时,大部
分时间需要一层一层的处理,如果有了xPath,我们定位我们的节点将变得很轻松。他可以根据路径,属性,甚至是条件进行节点的检索。
      XPath 使用路径表达式在XML 文档中进行导航
      XPath 包含一个标准函数库
      XPath 是 XSLT 中的主要元素
      XPath 是一个 W3C 标准

路径表达式语法:
      斜杠(/)作为路径内部的分割符。
      同一个节点有绝对路径和相对路径两种写法:
      路径(absolute path)必须用”/”起首,后面紧跟根节点,比如/step/step/…。
      相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step, 也就是不使用”/”起首。
      ”.”表示当前节点。
      ”..”表示当前节点的父节点
      nodename(节点名称):表示选择该节点的所有子节点
      ”/”:表示选择根节点
      ”//”:表示选择任意位置的某个节点
      ”@”: 表示选择某个属性