前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day07_02_XML解析思想

day07_02_XML解析思想

作者头像
黑泽君
发布2018-10-11 10:56:06
3170
发布2018-10-11 10:56:06
举报
文章被收录于专栏:黑泽君的专栏黑泽君的专栏

day07_02_XML解析思想

代码语言:javascript
复制
=============================================================================
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)
=============================================================================    
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

<书架>
    <书 出版社="黑马程序员">
        <书名>三国演义</书名>
        <作者>罗贯中</作者>
        <单价>20</单价>
        <批发价>10</批发价>
    </书>
    <书>
        <书名>葵花宝典</书名>
        <作者>东方不败</作者>
        <单价>15</单价>
    </书>
</书架>
代码语言:javascript
复制
示例解析XML(使用xml常用的解析器):
代码语言:javascript
复制
 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 }
代码语言:javascript
复制
示例解析XML(使用xml的XPATH解析器):
代码语言:javascript
复制
 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 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • day07_02_XML解析思想
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档