专栏首页黑泽君的专栏day07_02_XML解析思想

day07_02_XML解析思想

day07_02_XML解析思想

=============================================================================
XML解析:
    解析xml可以做:
        1. 如果xml作为配置文件:读取数据。
        2. 如果xml作为传输文件:可写可读。
--------------------------------------
xml解析思想:
    DOM:将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。
        优点:因为在内存中会形成dom树,可以对dom树进行增删改查。
        缺点:dom树非常占内存,解析速度慢。
--------------------------------------
    SAX:逐行读取,基于事件驱动(事件调方法)。
        优点:不占内存,速度快。
        缺点:只能读取,不能回写。        
--------------------------------------        
    DOM4J:是dom4j.org出品的一个开源XML解析包。DOM4J应用于Java平台,采用了Java集合框架并完全支持DOM、SAX和JAXP。
        DOM4J 使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。
        Dom:把整个文档作为一个对象。
        DOM4J 最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义:
            
            Document    定义XML文档
            Element     定义XML元素
            Text        定义XML文本节点
            Attribute   定义XML的属性
            Comment     定义XML注释的行为
--------------------------------------
    xml常用的解析器:
        JAXP:sun公司提供的解析。支持dom和sax。(不好用,sun自己都不用)
        JDOM:没火起来。
        DOM4J:(dom for java)民间方式,事实证明非常好用,支持dom。
            1. 导入jar包dom4j-1.6.1.jar
            2. 创建解析器
                SAXReader reader = new SAXReader();
            3. 解析xml获得document对象 
                Document document = reader.read(url); 
--------------------------------------
    示例解析XML(使用xml常用的解析器):
        1、得到某个具体的节点内容。例如:第2本书的书名 --> 葵花宝典
        2、遍历所有元素节点。
--------------------------------------
    XPATH:专门用于查询。
        定义了一种规则。
        常用的方法:
            selectSingleNode()
            selectNodes()
        使用步骤:
            1. 导包jaxen-1.1-beta-6.jar
            2. 创建解析器
                SAXReader reader = new SAXReader();
            3. 解析xml 获得document对象 
                Document document = reader.read(url);
--------------------------------------
    示例解析XML(使用xml的XPATH解析器):
        1、得到某个具体的节点内容。例如:第2本书的书名 --> 葵花宝典
        2、遍历所有元素节点。
--------------------------------------    
    XPath:
        nodename             选取此节点
        
        /AAA                 选择根节点AAA元素
        //BBB                选择所有AAA元素,而不考虑它们的位置
        //*                  全选(忽略深度)
        
        /AAA/BBB[1]          选择AAA的第一个BBB子元素
        /AAA/BBB[last[]]     选择AAA的最后一个BBB子元素
        ..                   选取当前节点的父节点
        
        //@id                选择所有的id属性
        //BBB[@id]           选择有id属性的BBB元素
        //BBB[not(@*)]       选择没有属性的BBB元素
        
        //BBB[@id='b1']      选择含有属性id值且其值为'b1'的BBB元素
        
        //*[count(BBB)=2]    选择含有2个BBB子元素的元素
        //*[count(*)=2]      选择含有2个子元素的元素
        
        //*[name()='BBB']    选择所有名称为BBB的元素(这里等价于//BBB)
=============================================================================    
<?xml version="1.0" encoding="UTF-8"?>

<书架>
    <书 出版社="黑马程序员">
        <书名>三国演义</书名>
        <作者>罗贯中</作者>
        <单价>20</单价>
        <批发价>10</批发价>
    </书>
    <书>
        <书名>葵花宝典</书名>
        <作者>东方不败</作者>
        <单价>15</单价>
    </书>
</书架>
示例解析XML(使用xml常用的解析器):
 1 package com.itheima.dom4j;
 2 
 3 import java.util.List;
 4 
 5 import org.dom4j.Document;
 6 import org.dom4j.DocumentException;
 7 import org.dom4j.Element;
 8 import org.dom4j.Node;
 9 import org.dom4j.io.SAXReader;
10 import org.junit.Test;
11 
12 public class TestDom4j {
13     @Test
14     // 1、得到某个具体的节点内容。例如:第2本书的书名 --> 葵花宝典
15     public void test1() throws DocumentException {
16         SAXReader reader = new SAXReader(); // 创建一个xml解析对象
17         Document document = reader.read("src/Book.xml"); // 把xml文档加载到document对象中(即内存中)
18         Element root = document.getRootElement(); // 得到根节点
19         // Element bookNode = root.element("书");
20         // System.out.println(bookNode.getName()); // 书
21         List list = root.elements(); // 得到根节点的所有子节点
22         Element secondBook = (Element) list.get(1); // 得到第二本书对象
23         String name = secondBook.element("书名").getText(); // 得到当前节点的文本内容
24         System.out.println(name);
25     }
26 
27     @Test
28     // 2、遍历所有元素节点。
29     public void test2() throws DocumentException {
30         SAXReader reader = new SAXReader(); // 创建一个xml解析对象
31         Document document = reader.read("src/Book.xml"); // 把xml文档加载到document对象中(即内存中)
32         Element root = document.getRootElement(); // 得到根节点
33         treeWalk(root);
34     }
35 
36     private void treeWalk(Element ele) {
37         // System.out.println(ele.getName()); // 输出当前节点的名字(第一次递归的当前节点是根节点)
38         for (int i = 0; i < ele.nodeCount(); i++) { // ele.nodeCount() 得到当前节点的所有子节点的数量
39             Node node = ele.node(i); // 取出下标为i的节点
40             if (node instanceof Element) { // 判断当前节点是否为元素类型
41                 treeWalk((Element) node); // 是,把断当前节点node类型强转为元素Element
42             } else {
43                 System.out.print(node.getText());
44             }
45         }
46     }
47 
48 }
示例解析XML(使用xml的XPATH解析器):
 1 package com.itheima.dom4j;
 2 
 3 import java.util.List;
 4 
 5 import org.dom4j.Document;
 6 import org.dom4j.Node;
 7 import org.dom4j.io.SAXReader;
 8 import org.junit.Test;
 9 
10 public class TestXPath {
11     @Test
12     // 1、得到某个具体的节点内容。例如:第2本书的书名 --> 葵花宝典
13     public void test() throws Exception {
14         SAXReader read = new SAXReader();
15         Document document = read.read("src/Book.xml");
16         Node node = document.selectSingleNode("/书架/书[2]/书名"); // 类似于路径
17         System.out.println(node.getText());
18     }
19 
20     @Test
21     // 2、遍历所有元素节点。
22     public void test2() throws Exception {
23         SAXReader read = new SAXReader();
24         Document document = read.read("src/Book.xml");
25         List list = document.selectNodes("//*"); // 双反斜杠表示忽略深度的意思。单斜杠表示深度,更具体。
26         for (int i = 0; i < list.size(); i++) {
27             Node node = (Node) list.get(i);
28             System.out.println(node.getName() + "\t" + node.getText());
29         }
30     }
31 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • XML CDATA 的详解

    原文链接:http://www.w3school.com.cn/xml/xml_cdata.asp

    黑泽君
  • day45_Webservice学习笔记_01

    Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。

    黑泽君
  • 解决vi编辑器不能使用方向键和退格键问题的两种方法

      在Ubuntu中,进入vi命令的编辑模式,发现按方向键不能移动光标,而是会输出ABCD,以及退格键也不能正常删除字符。这是由于Ubuntu预装的是vim-t...

    黑泽君
  • 分析Silverlight跨域调用

    分析Silverlight跨域调用 在silverlight开发的过程中不免要遇到跨域的问题,在这里以跨域调用Webservice为例子来分析一下跨域的问题。...

    用户1172164
  • 科技公司如何利用数据让用户习惯成瘾?

    注:作为一个普通用户,我们之前可能没听说过,但是诱导技术(Persuasive technology)在我们周围到处都是,而且这些科技正在变得更加智能。它们是如...

    CSDN技术头条
  • 数据分布算法:hash+ 一致性 hash + redis cluster 的 hash slot

    hash 算法 -> 一致性 hash 算法(memcached) -> redis cluster 的 hash slot 算法

    HUC思梦
  • 为什么不建议你入门计算机视觉

    作者:Jackpop https://zhihu.com/p/question/317440183 本文已授权,未经允许,不得二次转载

    小白学视觉
  • 微信为什么不丢消息?

    上一章和大家分享了《http如何像tcp一样实时的收消息?》, 本章来聊一聊即时通讯(Instant Messaging,后简称im)消息的可靠投递。 一、报文...

    架构师之路
  • 徒手撸一个JSON解析器

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。相对于另一种数据交换格式 XML,JSON 有着诸多优点。比如易读...

    南风
  • python3不再支持mysqldb 请

    python3不再支持mysqldb 请用pymysql和mysql.connector

    py3study

扫码关注云+社区

领取腾讯云代金券