JAVASE02-Unit012: Unit07: XML语法 XML解析

Posted 唐胜伟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVASE02-Unit012: Unit07: XML语法 XML解析相关的知识,希望对你有一定的参考价值。

    Unit07: XML语法 、 XML解析    

emplist.xml

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <emp id="1">
        <name>张三</name>
        <age>34</age>
        <gender></gender>
        <salary>3000</salary>
    </emp>
    <emp id="2">
        <name>李四</name>
        <age>21</age>
        <gender></gender>
        <salary>4000</salary>
    </emp>
    <emp id="3">
        <name>王五</name>
        <age>46</age>
        <gender></gender>
        <salary>6500</salary>
    </emp>
    <emp id="4">
        <name>赵六</name>
        <age>28</age>
        <gender></gender>
        <salary>4400</salary>
    </emp>
    <emp id="5">
        <name>钱七</name>
        <age>53</age>
        <gender></gender>
        <salary>12000</salary>
    </emp>
</list>
emplist.xml

myemp.xml

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

<list>
  <emp id="1">
    <name>张三</name>
    <age>22</age>
    <gender></gender>
    <salary>5000</salary>
  </emp>
  <emp id="2">
    <name>李四</name>
    <age>23</age>
    <gender></gender>
    <salary>6000</salary>
  </emp>
  <emp id="3">
    <name>王五</name>
    <age>24</age>
    <gender></gender>
    <salary>7000</salary>
  </emp>
  <emp id="4">
    <name>赵六</name>
    <age>25</age>
    <gender></gender>
    <salary>8000</salary>
  </emp>
  <emp id="5">
    <name>钱七</name>
    <age>26</age>
    <gender></gender>
    <salary>9000</salary>
  </emp>
</list>
myemp.xml

用当前类的实例保存xml文档中的一个员工信息 (这个是用构造方法生成的)

package day12;
/**
 * 用当前类的实例保存xml文档中的一个员工信息
 * @author adminitartor
 *
 */
public class Emp {
    private int id;
    private String name;
    private int age;
    private String gender;
    private int salary;
    
    public Emp(){
        
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }
    
    public String toString(){
        return id + "," + name + "," +
               age + "," + gender + "," +
               salary;
    }
}
Emp.java

 * 使用DOM4J解析XML文档

package day12;

import java.io.FileInputStream;
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;

/**
 * 使用DOM4J解析XML文档
 * 
 * 将emplist.xml文档中的所有员工信息解析出来
 * 并存入到一个List集合保存
 * @author adminitartor
 *
 */
public class ParseXmlDemo {
    public static void main(String[] args) {
        /*
         * 使用DOM4J解析XML的大致流程
         * 1:创建SAXReader
         * 2:使用SAXReader读取XML文档,并返回
         *   一个Document对象。
         *   这一步就是DOM解析XML耗时耗资源的地方
         *   因为这一步就会将XML文档中所有内容解析
         *   出来并以一个Document对象保存。由于对象
         *   存于内存,所以文档内容大的话会相应消耗
         *   资源。
         * 3:从Document中获取根元素
         * 4:根据XML文档结构从根元素中逐级获取子元
         *   素,最终达到遍历XML文档数据的目的。  
         */
        try {
            //1
            SAXReader reader = new SAXReader();
            
            //2读取xml文档并返回Document对象
//            reader.read(new File("emplist.xml"));
            Document doc = reader.read(
                new FileInputStream("emplist.xml")
            );
            System.out.println("读取xml文档完毕!");
            
            /*
             * 3 获取根元素
             * Element的每一个实例用于表示XML文档
             * 中的一个元素(一对标签)
             * 
             * Element用于获取当前标签信息的相关方法:
             * 
             * String getName()
             * 获取当前标签的名字
             * 
             * String getText()
             * 获取当前标签中间的文本信息
             * 
             * List elements()
             * 获取当前标签下的所有子标签
             * 
             * List elements(String name)
             * 获取当前标签下所有同名子标签
             * 
             * Element element(String name)
             * 获取当前标签下指定名字的子标签
             * 
             * String elementText(String name)
             * 获取当前标签下指定名字的子标签中间的
             * 文本。
             * ele.elementText(name)
             * 相当于调用了:
             * ele.element(name).getText()
             * 
             * Attribute attribute(String name)
             * 获取当前标签下指定名字的属性
             * 
             */
            Element root = doc.getRootElement();
            /*
             * 该集合用于保存从xml文档中解析出来的
             * 所有员工信息
             */
            List<Emp> empList = new ArrayList<Emp>();
            
            //获取根标签<list>下面的所有子标签<emp>
            List<Element> list = root.elements();
            /*
             * 遍历每一个员工标签<emp>,并将信息保存
             * 到一个Emp对象上,然后存入empList集合
             */
            for(Element empEle : list){
                //获取name
                Element nameEle = empEle.element("name");
                String name = nameEle.getText();
//                System.out.println(name);
                
                //获取age
                int age = Integer.parseInt(
                    empEle.elementText("age")
                );
                
                //gender
                String gender = empEle.elementText("gender");
                
                //salary
                int salary = Integer.parseInt(
                    empEle.elementText("salary")    
                );
                /*
                 * Attribute的每一个实例用于表示某个标签
                 * 中的一个属性。
                 * 常用方法:
                 * String getName()
                 * 获取属性名
                 * 
                 * String getValue()
                 * 获取属性值
                 */
                Attribute attri = empEle.attribute("id");
                int id = Integer.parseInt(
                    attri.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();
        }
        
        
        
    }
}
ParseXmlDemo.java

 * 使用DOM4J生成XML文档

package day12;

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;

/**
 * 使用DOM4J生成XML文档
 * @author adminitartor
 *
 */
public class WriteXmlDemo {
    public static void main(String[] args) {
        /*
         * 生成XML文档的大致步骤:
         * 1:创建一个Document对象表示一个空白
         *   文档
         * 2:向Document中添加根元素
         * 3:按照想生成的xml文档的结构顺序逐级的
         *   向根元素中添加子元素以及对应的信息
         * 4:创建XmlWriter对象
         * 5:将Document对象写出以形成xml文档
         * 6:关闭XmlWriter    
         */
        try {
            List<Emp> empList = new ArrayList<Emp>();
            empList.add(new Emp(1,"张三",22,"男",5000));
            empList.add(new Emp(2,"李四",23,"女",6000));
            empList.add(new Emp(3,"王五",24,"男",7000));
            empList.add(new Emp(4,"赵六",25,"女",8000));
            empList.add(new Emp(5,"钱七",26,"男",9000));
            
            //1 创建一个空白文档
            Document doc = DocumentHelper.createDocument();
            
            /*
             * 2 向文档中添加根元素
             * Element addElement(String name)
             * 添加给定名字的根元素,并将该元素以Element
             * 实例形式返回,以便于继续操作。
             * 
             * 注意,该方法只能调用一次,因为一个文档只能有
             * 一个根元素
             * 
             */
            Element root = doc.addElement("list");
            
            /*
             * 3 添加子标签以形成xml文档结构
             * 将集合中的每个员工信息作为一个<emp>标签
             * 添加到根标签中
             */
            for(Emp emp : empList){
                /*
                 * Element提供了添加相应信息的方法:
                 * 
                 * Element addElement(String name)
                 * 向当前标签中添加给定名字的子标签并将其
                 * 返回。
                 */
                Element empEle = root.addElement("emp");
                
                //向<emp>标签中添加<name>标签
                Element nameEle = empEle.addElement("name");
                //向<name>标签中添加文本信息
                nameEle.addText(emp.getName());
                
                empEle.addElement("age").addText(emp.getAge()+"");
                
                empEle.addElement("gender").addText(emp.getGender());
                
                empEle.addElement("salary").addText(emp.getSalary()+"");
                /*
                 * 向<emp>标签中添加属性"id"
                 */
                empEle.addAttribute("id", emp.getId()+"");            
            }
            
            //4
            XMLWriter writer = new XMLWriter(
                new FileOutputStream("myemp.xml"),
                OutputFormat.createPrettyPrint()
            );
            
            writer.write(doc);
            System.out.println("写出完毕!");
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
}
WriteXmlDemo.java

 * 使用XPath检索XML数据

package day12;

import java.io.File;
import java.util.List;

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

/**
 * 使用XPath检索XML数据
 * @author adminitartor
 *
 */
public class XpathDemo {
    public static void main(String[] args) {
        try {
            SAXReader reader = new SAXReader();
            Document doc = reader.read(
                new File("myemp.xml")
            );
            String path = "/list/emp[gender=\'女\' and age>24]/salary";
            List<Element> list = doc.selectNodes(path);
            for(Element e : list){
                System.out.println(e.getText());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
XpathDemo.java

 

以上是关于JAVASE02-Unit012: Unit07: XML语法 XML解析的主要内容,如果未能解决你的问题,请参考以下文章

JAVASE02-Unit05: 集合操作 —— 查找表

JAVASE02-Unit04: 集合框架 集合操作 —— 线性表

JAVASE02-Unit08: 文本数据IO操作 异常处理

JAVASE02-Unit03: 日期操作 集合框架

JAVASE02-Unit010: 多线程基础 TCP通信

JAVASE02-Unit01: API文档 字符串基本操作