Java解析XML

(一)XML解析技术
解析:用java等技术将xml文件中有用的信息提取出来的过程。
现常用的有两大类别:

  • DOM类别: 一次性将硬盘中的xml文件加载到内存中形成一颗倒状树,从根节点开始从上向下遍历,获取有用节点的内容。
  • SAX类别:分多次将硬盘中的xml文件加载到内存中,以事件的方式去解析节点中有用的内容。

在这里我们选择XML解析器:dom4.j;dom4.j开发包叫:dom4.j-1.6.1.jar导入到你的工程的CLASSPATH路径下
(二)DOM4.J简单介绍
1、Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性
2、Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j
3、使用Dom4j开发,需下载dom4j相应的jar文件

(三)DOM4J解析案例

  • 1、获得document的三种方式
    (1)读取
    (2)字符串转换
    (3)新建对象

(1)读取




package cn.itcast.andorid.copyOfDom4.j;

import java.io.File;
import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.XMLWriter;

public class Demo01 {
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //将内存中的xml文件写入硬盘中去
        //创建一个内存中的document对象,表示硬盘中的xml文件
        Document xmlDocument =  DocumentHelper.createDocument();
        //将内存中的document文件写入硬盘中,形成一个xml文件
        XMLWriter xmlWriter = new XMLWriter(
            new FileOutputStream(new File("E:/new123.xml"))
        );
        xmlWriter.write(xmlDocument);
        xmlWriter.close();      
    }
}

结果:



(2)字符串转换


public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        //type01(); 
        //字符串转换
        String str = "广州";
        Document xmlDocument = DocumentHelper.parseText(str);
        XMLWriter xmlWriter = new XMLWriter(
                new FileOutputStream(new File("E:/book1.xml"))
            );
            xmlWriter.write(xmlDocument);
            xmlWriter.close();
    }

(3)新建对象


public static void main(String[] args) throws Exception {       
   
        //新创建对象,dom4.j核心解析器
        SAXReader saxReader = new SAXReader();
        Document xmlDocument = saxReader.read(new File("E:/book.xml"));
        System.out.println(xmlDocument !=null?"已读到xml文件":"未读取到xml文件");
    }

结果:

Java解析XML_第1张图片
  • 2、获得根节点和其子节点
package cn.itcast.andorid.copyOfDom4.j;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Demo02 {

    public static void main(String[] args) throws Exception {
        //创建dom4.j解析器
        SAXReader saxReader = new SAXReader();
        //创建InputStream对象,指向硬盘中的xml文件
        InputStream is = new FileInputStream(new File("E:/new.xml"));
        Document xmlDocument = saxReader.read(is);
        //获取根节点
        Element rootElement = xmlDocument.getRootElement();
        //输出根节点名字
        System.out.println(rootElement.getName());
        //获取根节点下面的直接子节点个数和名字
        List listElement = rootElement.elements("city");
        System.out.println(listElement.size());
        for(int i = 0;i
Java解析XML_第2张图片
  • 3、遍历每个子节点属性和标签中的内容
package cn.itcast.andorid.copyOfDom4.j;

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

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

public class Demo03 {

    public static void main(String[] args) throws Exception {
        //遍历子节点的属性和内容
        //创建dom4.j解析器
        SAXReader saxReader = new SAXReader();
        /*Document xmlDocument  = saxReader.read(new File("E:/new.xml"));*/
        //创建InputStream对象,指向硬盘中的XML文件
        InputStream is = new  FileInputStream(new File("E:/book.xml"));
        //通过字节流对象,加载硬盘中的XML文件到内存中
        Document xmlDocument = saxReader.read(is);
        //获取根节点
        Element rootElement = xmlDocument.getRootElement();
        //显示根节点的名字
        System.out.println(rootElement.getName());
        //获取根节点下面的直接子节点个数和名字
        List elementList = rootElement.elements("book");
        //子节点个数
        System.out.println(elementList.size());
        /*System.out.println(elementList.size());*/
        for(Element element : elementList){
            //分别输出子节点title,price,author的内容
            String titleElement = element.element("title").getText().trim();
            System.out.println(titleElement);
            
            String priceElement = element.element("price").getText().trim();
            System.out.println(priceElement);
            
            String authorElement = element.element("author").getText().trim();
            System.out.println(authorElement);
            
            //子节点的id属性
            String id = element.attributeValue("id");
            System.out.println(id);
        }
                

    }

}

Java解析XML_第3张图片

(四)将Document对象写入XML文件

  • 文档中全为英文,不设置编码,直接写入的形式
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
  • 文档中含有中文,设置编码格式写入的形式
package cn.itcast.andorid.copyOfDom4.j;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Demo04 {

    public static void main(String[] args) throws Exception {
        //创建dom4.j解析器
        SAXReader saxReader = new SAXReader();
        //创建InputStream对象,指向硬盘中的xml文件
        InputStream is = new FileInputStream(new File("E:/book.xml"));
        Document xmlDocument = saxReader.read(is);  
        /*
         * 第一种方法
         * 
        //将DOUCMENT对象存放入硬盘中,形成xml文件
        XMLWriter writer = new XMLWriter(new FileWriter("e:/newbook.xml"));
        writer.write(xmlDocument);  
        writer.close();
        *
        */
        //第二种方法
        OutputFormat format = OutputFormat.createCompactFormat();
        OutputStream os = new FileOutputStream(new File("e:/newbook.xml"));
        XMLWriter  xmlWriter = new XMLWriter(os, format);
        xmlWriter.write(xmlDocument);
        xmlWriter.close();      
    }
}

(五)XPATH快速定位
若一个xml文档里有着多层次标签的时候,想要定位到某个标签的内容时,使用dom4.j只能够依次寻找从上到下,比较繁琐。因此,使用XPATH
1、XPATH是啥?

XPATH是一门在xml文档中查找信息的语言,可用来对其中的元素和属性进行遍历,简化了dom4.j查找节点的过程

2、XPATH语法

Java解析XML_第4张图片

3、查询节点
(1)获取所有符合条件的节点:selectNode()返回一个List集合
(2)获取符合条件的单个节点:selectSingleNode(xpath)返回一个Node元素,一般需要转换成Element类型,若有多个出现的话,只取其中一个。

你可能感兴趣的:(Java解析XML)