zoukankan      html  css  js  c++  java
  • JAVA对XML文件的读写

    转载自:https://www.cnblogs.com/yangliguo/p/7398996.html

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

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

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

    XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
    XML 元素可以在开始标签中包含属性,属性 (Attribute) 提供关于元素的额外(附加)信息。属性通常提供不属于数据组成部分的信息,但是对
    需要处理这个元素的应用程序来说却很重要。
    XML 属性必须加引号,属性值必须被引号包围,不过单引号和双引号均可使用。
    如果属性值本身包含双引号,那么有必要使用单引号包围它,或者可以使用实体引用。

    进入主题了

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

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <list>
     3     <emp id="">
     4         <name>张三</name>
     5         <age></age>
     6         <gender></gender>
     7     <salary>5000</salary>
     8     </emp>
     9 
    10 </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,具有性能优异、功能强
    大和极端易用使用的特点,同时它也是一个开放源代码的软件。

      1 package day12;
      2 
      3 import java.io.File;
      4 import java.util.ArrayList;
      5 import java.util.List;
      6 
      7 import org.dom4j.Attribute;
      8 import org.dom4j.Document;
      9 import org.dom4j.Element;
     10 import org.dom4j.io.SAXReader;
     11 
     12 /**
     13  * 使用DOM解析xml文档
     14  * @author ylg
     15  *
     16  */
     17 public class ParseXmlDemo {
     18     public static void main(String[] args) {
     19         try {
     20             /*
     21              * 解析XML大致流程
     22              * 1:创建SAXReader
     23              * 2:使用SAXReader读取数据源(xml文档信息)
     24              *   并生成一个Document对象,该对象即表示
     25              *   xml文档内容。DOM耗时耗内存资源也是在
     26              *   这一步体现的。因为会对整个XML文档进行
     27              *   读取并载入内存。
     28              * 3:通过Document对象获取根元素
     29              * 4:根据XML文档结构从根元素开始逐层获取
     30              *   子元素最终以达到遍历XML文档内容的目的
     31              *
     32              */
     33             //1
     34             SAXReader reader = new SAXReader();
     35 
     36             //2
     37             Document doc
     38              = reader.read(new File("emplist.xml"));
     39 
     40             /*
     41              * 3
     42              * Document提供了方法:
     43              * Element getRootElement()
     44              * 该方法是用来获取XML文档中的根元素,
     45              * 对于emplist.xml文档而言,根元素就是
     46              * <list>标签。
     47              *
     48              * Element类
     49              * 每一个Element实例都可以表示XML文档中的
     50              * 一个元素,即:一对标签。
     51              */
     52             Element root = doc.getRootElement();
     53             /*
     54              * Element提供了方法:
     55              * String getName()
     56              * 该方法可以获取当前元素的名字(标签名)
     57              */
     58             System.out.println(
     59                 "获取了根元素:"+root.getName()
     60             );
     61             //4
     62             /*
     63              * 获取一个元素中的子元素
     64              * Element提供了相关方法:
     65              *
     66              * 1
     67              * Element element(String name)
     68              * 获取当前元素下指定名字的子元素。
     69              *
     70              * 2:
     71              * List elements()
     72              * 获取当前元素下所有子元素
     73              *
     74              * 3:
     75              * List elements(String name)
     76              * 获取当前元素下所有同名子元素
     77              *
     78              * 2,3返回的集合中的每一个元素都是Element
     79              * 的实例,每个实例表示其中的一个子元素。
     80              *
     81              */
     82             //获取所有emp标签
     83             List<Element> list = root.elements();
     84 
     85             //用于保存所有员工信息的List集合
     86             List<Emp> empList = new ArrayList<Emp>();
     87 
     88             for(Element empEle : list){
     89 //              System.out.println(empEle.getName());
     90                 //获取员工名字
     91                 Element nameEle = empEle.element("name");
     92                 /*
     93                  * Element还提供了获取当前元素中文本的方法:
     94                  * String getText(),String getTextTrim()
     95                  */
     96                 String name = nameEle.getText();
     97                 System.out.println("name:"+name);
     98 
     99                 //获取员工年龄
    100                 int age = Integer.parseInt(
    101                     empEle.elementText("age")
    102                 );
    103 
    104                 //获取性别
    105                 String gender = empEle.elementText("gender");
    106 
    107                 //获取工资
    108                 int salary = Integer.parseInt(
    109                     empEle.elementText("salary")
    110                 );
    111                 /*
    112                  * Attribute attribute(String name)
    113                  * 获取当前元素(标签)中指定名字的属性
    114                  *
    115                  * Attribute的每一个实例用于表示一个
    116                  * 属性。其中常用方法:
    117                  * String getName():获取属性名
    118                  * String getValue():获取属性值
    119                  */
    120                 Attribute attr
    121                     = empEle.attribute("id");
    122                 int id = Integer.parseInt(
    123                     attr.getValue()
    124                 );
    125 
    126                 Emp emp = new Emp(id,name,age,gender,salary);
    127                 empList.add(emp);
    128             }
    129             System.out.println("解析完毕!");
    130             for(Emp emp : empList){
    131                 System.out.println(emp);
    132             }
    133 
    134 
    135         } catch (Exception e) {
    136             e.printStackTrace();
    137         }
    138     }
    139 }

    写XML

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

     1 import java.io.FileOutputStream;
     2 import java.util.ArrayList;
     3 import java.util.List;
     4 
     5 import org.dom4j.Document;
     6 import org.dom4j.DocumentHelper;
     7 import org.dom4j.Element;
     8 import org.dom4j.io.OutputFormat;
     9 import org.dom4j.io.XMLWriter;
    10 
    11 /**
    12  * 使用DOM生成XML文档
    13  * @author ylg
    14  *
    15  */
    16 public class WriteXmlDemo {
    17     public static void main(String[] args) {
    18         List<Emp> list = new ArrayList<Emp>();
    19         list.add(new Emp(1,"张三",25,"男",5000));
    20         list.add(new Emp(2,"李四",26,"女",6000));
    21         list.add(new Emp(3,"王五",27,"男",7000));
    22         list.add(new Emp(4,"赵六",28,"女",8000));
    23         list.add(new Emp(5,"钱七",29,"男",9000));
    24         /*
    25          * 使用DOM生成XML文档的大致步骤:
    26          * 1:创建一个Document对象表示一个空文档
    27          * 2:向Document中添加根元素
    28          * 3:按照文档应有的结构从根元素开始顺序添加
    29          *   子元素来形成该文档结构。
    30          * 4:创建XmlWriter对象
    31          * 5:将Document对象写出
    32          *   若写入到文件中则形成一个xml文件
    33          *   也可以写出到网络中作为传输数据使用  
    34          */
    35         
    36         //1
    37         Document doc 
    38             = DocumentHelper.createDocument();
    39         
    40         /*
    41          * 2
    42          * Document提供了添加根元素的方法:
    43          * Element addElement(String name)
    44          * 向当前文档中添加指定名字的根元素,返回
    45          * 的Element就表示这个根元素。
    46          * 需要注意,该方法只能调用一次,因为一个
    47          * 文档只能有一个根元素。
    48          */
    49         Element root = doc.addElement("list");
    50         
    51         //3
    52         for(Emp emp : list){
    53             /*
    54              * Element也提供了追加子元素的方法:
    55              * Element addElement(String name)
    56              * 调用次数没有限制,元素可以包含若干
    57              * 子元素。
    58              */
    59             Element empEle = root.addElement("emp");
    60             
    61             //添加name信息
    62             Element nameEle = empEle.addElement("name");
    63             nameEle.addText(emp.getName());
    64             
    65             //添加age信息
    66             Element ageEle = empEle.addElement("age");
    67             ageEle.addText(emp.getAge()+"");
    68             
    69             //添加gender信息
    70             Element genderEle = empEle.addElement("gender");
    71             genderEle.addText(emp.getGender());
    72             
    73             //添加salary信息
    74             Element salEle = empEle.addElement("salary");
    75             salEle.addText(emp.getSalary()+"");
    76             
    77             /*
    78              * 向当前元素中添加指定名字以及对应值的属性
    79              */
    80             empEle.addAttribute("id", emp.getId()+"");
    81                     
    82         }
    83         try{
    84             //4
    85             XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
    86             FileOutputStream fos
    87                 = new FileOutputStream("myemp.xml");
    88             writer.setOutputStream(fos);
    89             
    90             //5
    91             writer.write(doc);
    92             System.out.println("写出完毕!");
    93             writer.close();
    94         }catch(Exception e){
    95             e.printStackTrace();
    96         }
    97     }
    98 }

    注意事项:

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

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

  • 相关阅读:
    Android面向切面编程(AOP)(转)
    Android性能优化
    Android 性能分析之TraceView使用(应用耗时分析)
    Lint检查选项
    Android Chromium WebView Crash
    Could not get unknown property 'assembleRelease' for project ':app' of type org.gradle.api.Project.
    Android studio gradle 无法获取 pom文件
    android 7.0 因为file://引起的FileUriExposedException异常
    Android双系统实现
    git 安装 和 基本操作
  • 原文地址:https://www.cnblogs.com/cheng18/p/12052525.html
Copyright © 2011-2022 走看看