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

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

在XML中,所有的处理指令都以结束。<?后面紧跟的是处理指令的名称。

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
XML 元素可以在开始标签中包含属性,属性 (Attribute) 提供关于元素的额外(附加)信息。属性通常提供不属于数据组成部分的信息,但是对
需要处理这个元素的应用程序来说却很重要。
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(节点名称):表示选择该节点的所有子节点
      "/":表示选择根节点
      "//":表示选择任意位置的某个节点
"@": 表示选择某个属性

JAVA对XML文件的读写的更多相关文章

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

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

  2. # java对xml文件的基本操作

    下面是简单的总结三种常用的java对xml文件的操作 1. dom方式对xml进行操作,这种操作原理是将整个xml文档读入内存总,在内存中进行操作,当xml文档非常庞大的时候就会出现内存溢出的异常,这 ...

  3. 用java操作XML文件(DOM解析方式)

    XML 可扩展标记语言(Extensible Markup Language),是独立于软件和硬件的传输工具. XML的作用: (1)用作配置文件 (2)简化数据共享 (3)简化数据传输 XML DO ...

  4. java对xml文件做增删改查------摘录

    java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...

  5. 更新java对xml文件的操作

    //更新java在xml文件中操作的内容 public static void upda(Document doc) throws Exception{ //创建一个TransformerFactor ...

  6. Java操作xml文件

    Bbsxml.java public class Bbsxml { private String imgsrc; private String title; private String url; p ...

  7. java 读取XML文件作为配置文件

    首先,贴上自己的实例: XML文件:NewFile.xml(该文件与src目录同级) <?xml version="1.0" encoding="UTF-8&quo ...

  8. java读XML文件

    XML文件设计为传输和存储数据,其焦点为数据内容. HTML设计为用来显示数据, 其焦点为数据外观. XML仅仅是文本文件,任何文本编辑器一般情况下都能对其进行编辑. XML没有预定义的标签,并且设定 ...

  9. java读取xml文件报“org.xml.sax.SAXParseException: Premature end of file” .

    背景:java读取xml文件,xml文件内容只有“<?xml version="1.0" encoding="UTF-8"?>”一行 java读取该 ...

随机推荐

  1. 基于idea做java程序的本地k8s调试-skaffold(二)

    上一篇讲完了java代码发到本机minikube中run,这篇来讲讲minkube中进行debug(idea下) 话说,上篇是把pigx基础infra微服务都发到了minikube中,这些微服务是ru ...

  2. 02 基础 卸载JDK 安装JDK Java程序运行机制

    基础 JDK:Java Development Kit(Java开发者工具 包含JRE和JVM) JRE:Java Runtime Environment(java运行时环境,包含JVM) JVM:J ...

  3. Nginx多个域名配置ssl证书出错解决方案

    解决方案一: 验证通配符 SSL 证书 当涉及通配符 SSL 证书时,NET::ERR_CERT_COMMON_NAME_INVALID 错误会变得稍微复杂一些. 这种类型的证书旨在加密多个子域的数据 ...

  4. MATLAB探索初步问题汇总

    MATLAB命令窗口如果显示:尝试将SCRIPT normrnd作为函数执行:C:\User-- 出错sort 这类问题,一般是你的*.m文件的名与内置函数名重名,改一下文件名即可. 2.MATLAB ...

  5. Linux配置FTP(vsftpd)服务和无法上传下载问题解决

    vsftpd的配置说明 ftp的配置文件主要有三个,位于/etc/vsftpd/目录下,分别是: ftpusers 该文件用来指定那些用户不能访问ftp服务器. user_list 该文件用来指示的默 ...

  6. Java案例——日期工具类

    需求:定义一个日期工具类,包含两个方法,按日期转化成指定格式的字符串,把字符串解析为指定格式的日期 然后定义一个测试类测试 分析: 1.定义一个日期工具类 2.定义一个方法dateToString,用 ...

  7. CodeUp Problem D: More is better

    根据题目意思,输入的每一对A.B都是直接朋友,并且最后只会得到一个集合,该集合就是Mr Wang选择的男孩. 因此很容易写出代码,甚至不需要自己构建一个并查集,只需要使用C++的set模板,每次读入一 ...

  8. springcloud学习02-对springcloud的理解的记录

    以下都是基于这些资料整理的知识点 学习资料: https://windmt.com/2018/04/14/spring-cloud-0-microservices/ https://www.sprin ...

  9. J20航模遥控器开源项目系列教程(七)PPM输出 | 关于按键版本和旋转编码器版本的兼容说明、布局建议 | 关于MINI版PCB的兼容说明

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...

  10. 202A 202B 202C 202D 202E字符的作用及解释

    这里你会发现在值的前后有2个\u开头的控制字符:转换网址:http://www.jsons.cn/utf8/ 解释:https://blog.csdn.net/haiyan1111/article/d ...