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 = "<root><city>广州</city></root>";
        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文件");
    }

结果:

  • 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<Element> listElement = rootElement.elements("city");
        System.out.println(listElement.size());
        for(int i = 0;i<listElement.size();i++){
            System.out.println(listElement.get(i).getText());
        }
    }
}

  • 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<Element> 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);
        }
                

    }

}


(四)将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语法


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容