day22 XML和Dom4j

第一章 XML

1.1 XML介绍

什么是XML

  • XML 指可扩展标记语言(EXtensible Markup Language

  • XML是用来传输数据的,不是用来显示数据的。之后学习另外一个HTML是用来显示数据的。

  • XML 标签没有被预定义。您需要自行定义标签。

  • XML 是 W3C 的推荐标准

    W3C在1988年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本。
    在这里插入图片描述
    在这里插入图片描述
    XML 与 HTML 的主要差异

  • html语法松散,xml语法严格,区分大小写

  • html做页面展示,xml传输数据

  • html所有标签都是预定义的,xml所有标签都是自定义的

xml的作用

  • 作为配置文件。 javaee框架 ssm大部分都会使用xml作为配置文件

  • XML可以存储数据 , 作为数据交换的载体(使用XML格式进行数据的传输)。

1.2 XML组成元素

一个标准XML文件一般由以下几部分组成:文档声明、元素、属性、注释、转义字符、字符区。


<?xml version="1.0" encoding="utf-8" ?>
  1. 文档声明可以不写

  2. 文档声明必须为<?xml开头,以?>结束

  3. 文档声明必须从文档的0行0列位置开始

  4. 文档声明中常见的两个属性:

  • version:指定XML文档版本。必须属性,这里一般选择1.0;
  • enconding:指定当前文档的编码,可选属性,默认值是utf-8;

元素\标签

  1. 元素是XML中最重要的组成部分,元素也叫标签

  2. 标签分为开始标签和结束标签,开始标签<名字> 结束标签</名字>

  3. 开始标签和结束标签中间写的是标签内容,标签的内容可以是文本,也可以是其他标签

  4. 如果标签没有任何内容,那么可以定义空标签(比如:<名字/>)

  5. 标签可以嵌套,但是不能乱嵌套

  6. 一个XML文件只有一个根标签

  7. 命名规则:
    ​ 不要使用XML xML xml 写样的单词

    ​ 不能使用空格,冒号

    ​ 命名区分大小写

    数字不能开头

    <?xml version="1.0" encoding="UTF-8" ?>
    <person>
        <name>唐三</name>
        <age>年龄</age>
        <aaa/>
    </person>
    

属性

  1. 位置: 属性是元素的一部分,它必须出现在元素的开始标签中,不能写在结束标签中

  2. 格式: 属性的定义格式:属性名=“属性值”,其中属性值必须使用单引或双引号括起来

  3. 一个元素可以有0~N个属性,但一个元素中不能出现同名属性

  4. 属性名不能使用空格 , 不要使用冒号等特殊字符,且必须以字母开头

    <?xml version="1.0" encoding="UTF-8" ?>
    <person>
        <name id = "001" level = '98'>唐三</name>
        <age>10</age>
    
        <aaa type = 'itheima' />
    </person>
    

注释

<!--注释内容-->
  • XML的注释,既以<!--开始,-->结束。
  • 注释不能嵌套
  • idea上快捷键:ctrl + /

转义字符

​ 因为有些特殊的字符在XML中是不会被识别的,所以在元素体或属性值中想使用这些符号就必须使用转义字符(也叫实体字符),例如:">"、"<"、"’"、"""、"&"。
在这里插入图片描述
注意:严格地讲,在 XML 中仅有字符 “<“和”&” 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

转义字符应用示例:

<price> 苹果的价格: price > 5 &amp;&amp;  price &lt; 10</price>

字符区(了解)

  • CDATA 内部的所有东西都会被解析器忽略,当做文本
<![CDATA[
	文本数据
]]>
<!--写步骤 -->
<>
<!>
<![]>
<![CDATA]>
<![CDATA[ 文本 ]]>

<!-- 案例 -->
 <price>
        <![CDATA[
            苹果的价格: price > 5 &&  price < 10
        ]]>
 </price>

1.3 XML文件的约束-DTD约束(了解)

xml约束概述

  • 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
  • 约束文档定义了在XML中允许出现的元素(标签)名称、属性及元素(标签)出现的顺序等等。
  • 两种约束:DTD约束(文件后缀为dtd),Schema约束(文件后缀为xsd)
  • 注意: 约束不是我们要写的东西,我们的工作是根据约束去写XML

根据DTD约束写XML

  • DTD约束文档
<?xml version="1.0" encoding="UTF-8" ?>
<!--
    复制内容如下到XML文件中:
        <!DOCTYPE 书架 SYSTEM "bookdtd.dtd">
-->
<!--
对元素的约束:
ELEMENT表示这是一个元素 书架表示根标签  书是书架的子标签  +数量词,表示出现的次数,至少出现一次(大于等于1次)
-->
<!ELEMENT 书架 (书+)>
<!--书 这是一个标签  书标签中包含书名,作者,售价这些子标签 ,表示子标签出现的顺序关系-->
<!ELEMENT  (书名,作者,售价)>
<!--书名 这是一个标签  #PCDATA标签类型 书名标签中是文本-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

<!--ATTLIST表示对属性的约束 对书标签的 id,编号,出版社,type属性进行约束 -->
<!--属性名为id 属性的类型为ID(ID类型表示唯一,并且不能以数字开头) #REQUIRED表示id属性必须要有 -->
<!--属性名为编号  属性的类型为CDATA(文本) #IMPLIED表示编号属性可有可无-->
<!--属性名为出版社 属性的类型为枚举类型(任选其一)  "传智播客" 默认值为传智播客-->
<!-- 属性名为type 属性的类型为CDATA文本 #FIXED表示固定值为 "IT" -->
<!ATTLIST 
        id ID #REQUIRED
        编号 CDATA #IMPLIED
        出版社 (清华|北大|传智播客) "传智播客"
        type CDATA #FIXED "IT"
        >       
  • XML

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE 书架 SYSTEM "bookdtd.dtd">
    <书架>
        < id="a1" 编号="001" 出版社="清华" type="IT">
            <书名>斗罗大陆</书名>
            <作者>唐家三少</作者>
            <售价>99.8</售价>
        </>
        < id="a2">
            <书名>java从入门到放弃</书名>
            <作者>无名氏</作者>
            <售价>9.8</售价>
        </>
    </书架>
    

文档声明(了解)

  1. 内部DTD,在XML文档内部嵌入DTD,只对当前XML有效。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 根元素 [元素声明]>><!--内部DTD-->
    
  2. 外部DTD—本地DTD,DTD文档在本地系统上,企业内部自己项目使用。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 根元素 SYSTEM "文件名"><!--外部本地DTD-->
    
  3. 外部DTD—公共DTD,DTD文档在网络上,一般都有框架提供 , 也是我们使用最多的.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
    
    例如: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    

元素声明(了解)

  1. 约束元素的嵌套层级

    语法

    <!ELEMENT 父标签 (子标签1,子标签2,…)>
    例如:
    <!ELEMENT books (book+)> <!--约束根元素是"books","books"子元素为"book",“+”为数量词-->
    <!ELEMENT book (name,author,price)><!--约束"book"子元素依次为“name”、“author”、“price”,-->
    
  2. 约束元素体里面的数据

    语法

    <!ELEMENT 标签名字 标签类型>
    例如 <!ELEMENT name (#PCDATA)>
    

    标签类型: EMPTY(即空元素,例如<hr/>) ANY(任意类型) (#PCDATA) 字符串数据

    代码

    <!ELEMENT name (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT price (#PCDATA)>
    
  3. 数量词(掌握)

    数量词符号含义
    *表示元素可以出现0到多个
    +表示元素可以出现至少1个
    ?表示元素可以是0或1个
    ,表示元素需要按照顺序显示
    |表示元素需要选择其中的某一个

属性声明(了解)

语法

<!ATTLIST 标签名称 
		属性名称1 属性类型1 属性说明1
		属性名称2 属性类型2 属性说明2
		…
>
例如
<!ATTLIST book bid ID #REQUIRED>

属性类型

  • CDATA :表示文本字符串
  • ID:表示属性值唯一,不能以数字开头
  • ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)

属性说明:

  • REQUIRED:表示该属性必须出现
  • IMPLIED:表示该属性可有可无
  • FIXED:表示属性的取值为一个固定值。语法:#FIXED “固定值”

属性说明

代码

<!ATTLIST 书									<!--设置"书"元素的的属性列表-->
		id ID #REQUIRED						 <!--"id"属性值为必须有-->
		编号 CDATA #IMPLIED				    <!--"编号"属性可有可无-->
		出版社 (清华|北大|传智播客) "传智播客"   <!--"出版社"属性值是枚举值,默认为“传智播客”-->
		type CDATA #FIXED "IT"                <!--"type"属性为文本字符串并且固定值为"IT"-->
>

案例

<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
   <!ELEMENT 购物篮 (肉+)>
	<!ELEMENT  EMPTY>
	<!ATTLIST  品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
	< 品种="牛肉"></>
    < 品种="牛肉"></>
    < 品种="鱼肉"></>
    </>
</购物篮>

第二章 Dom4j

2.1 XML解析

解析方式

  • 开发中比较常见的解析方式有三种,如下:

    1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象

      a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

      b)缺点:XML文档过大,可能出现内存溢出

    2. SAX:是一种速度更快,更有效的方法。她逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都触发对应的事件。(了解)

      a)优点:不会出现内存问题,可以处理大文件

      b)缺点:只能读,不能回写。

    3. PULL:Android内置的XML解析方式,类似SAX。(了解)

  • 解析器,就是根据不同的解析方式提供具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包

在这里插入图片描述
解析包

  • JAXP:sun公司提供支持DOM和SAX开发包
  • Dom4j: 比较简单的的解析开发包(常用),
  • JDom:与Dom4j类似
  • Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便(项目中讲解)

2.2 Dom4j的基本使用 重点掌握

2.21DOM解析原理及结构模型

  • 解析原理

    XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。以下面books.xml文档为例。

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book id="0001">
            <name>JavaWeb开发教程</name>
            <author>张孝祥</author>
            <sale>100.00元</sale>
        </book>
        <book id="0002">
            <name>三国演义</name>
            <author>罗贯中</author>
            <sale>100.00元</sale>
        </book>
    </books>
    
  • 结构模型
    在这里插入图片描述
    DOM中的核心概念就是节点,在XML文档中的元素、属性、文本,在DOM中都是节点!所有的节点都封装到了Document对象中。

2.2.2 使用步骤

  1. 导入jar包 dom4j-1.6.1j.jar
  2. 创建解析器
  3. 读取xml 获得document对象
  4. 得到根元素
  5. 根据根元素获取对于的子元素或者属性

2.2.3 常用的方法

创建解析器对象:
	SAXReader sr = new SAXReader();
解析器读取文件方法:
	Document doc = sr.read(String fileName);
Document的方法:
	getRootElement()			: 获取根元素	
	
节点中的方法:	
	elements()     				: 获取当前元素的子元素
	element(String name)		: 根据元素名获取指定子元素(如果有多个就获取到第一个)
	getName()					: 获取元素的元素名
    elementText(String name)	: 获取指定子元素的文本值,参数是子元素名称
	attributeValue(String name)	: 获取当前元素下某个属性的值
	getText()					: 获取当前元素的文本值

2.2.4 方法演示

  • xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <天气预报>
        <北京 provide='' id='1'>
            <温度>
                <最高温度 level="A">18</最高温度>
                <最低温度>6</最低温度>
            </温度>
            <湿度>20%</湿度>
        </北京>
    
        <深圳>
            <温度>
                <最高温度 level="C">36</最高温度>
                <最低温度>24</最低温度>
            </温度>
            <湿度>50%</湿度>
        </深圳>
    	
    	 <广州>
    	 
    		<温度>
                <最高温度 level="C">32</最高温度>
                <最低温度>21</最低温度>
            </温度>
            <湿度>50%</湿度>
    		
    		<黄浦区>
    			<温度>
    				<最高温度 level="C">31</最高温度>
    				<最低温度>22</最低温度>
    			</温度>
    			<湿度>50%</湿度>
    		</黄浦区>
    		
    		<天河区>
    			<温度>
    				<最高温度 level="C">30</最高温度>
    				<最低温度>26</最低温度>
    			</温度>
    			<湿度>50%</湿度>
    		</天河区>
    
        </广州>
    </天气预报>
    
  • 解析

public class Test {
    public static void main(String[] args) throws Exception {
        /*
            解析步骤:
                1.导入DOM4J的jar包
                2.创建解析器
                3.使用解析器解析xml文件,生成document对象
                4.使用document对象获得根元素
                5.使用根元素去获取你想要获取的子元素或者属性
            常用方法:
                创建解析器对象: 解析器SAXReader
                    SAXReader sr = new SAXReader();

                解析器读取文件方法:  文档Document
                    Document doc = sr.read(String fileName);// 传入xml文件的路径

                Document的方法: 元素Element 父类Node 都是表示标签或者元素
                    Element getRootElement()			: 获取根元素

                元素\标签中的方法: Element
                    elements()     				: 获取当前元素的所有子元素
                    getName()					: 获取当前元素的元素名
                    getText()					: 获取当前元素的文本值
                    attributeValue(String name)	: 获取当前元素下某个属性的值

                    element(String name)		: 根据元素名获取指定子元素(如果有多个就获取到第一个)
                    elementText(String name)	: 获取指定子元素的文本值,参数是子元素名称

         */
        // 创建解析器对象
        SAXReader sr = new SAXReader();

        // 使用解析器解析xml文件,生成document对象
        Document document = sr.read("day22/tianqi.xml");

        // 使用document对象获得根元素
        Element rootE = document.getRootElement();
        System.out.println(rootE);

        // elements()     				: 获取当前元素的所有子元素
        // 获取根元素下的所有子元素
        List<Element> eList = rootE.elements();
        System.out.println("根元素下子元素的个数:"+eList.size());// 3

        // 遍历根元素下的所有子元素 的名称
        for (Element e : eList) {
            // getName()					: 获取元素的元素名
            System.out.println(e.getName());
        }

        System.out.println("=======================");
        // element(String name)		: 根据元素名获取指定子元素(如果有多个就获取到第一个)
        // 获取根元素下的北京子元素
        Element e1 = rootE.element("北京");
        System.out.println(e1.getName());// 北京

        System.out.println("====================");
        // 获取北京下的子元素湿度的文本
        // elementText(String name)	: 获取指定子元素的文本值,参数是子元素名称
        System.out.println(e1.elementText("湿度"));// 20%

        System.out.println("====================");

        // getText()					: 获取当前元素的文本值
        // 获取北京下的子元素湿度
        Element e2 = e1.element("湿度");
        System.out.println(e2.getText());// 20%

        System.out.println("====================");
        // attributeValue(String name)	: 获取当前元素下某个属性的值
        // 获取北京元素的provide属性的值
        System.out.println(e1.attributeValue("provide"));// 京

    }
}

2.3 Dom4J结合XPath解析XML

2.3.1 介绍

​ XPath 使用路径表达式来选取HTML\XML 文档中的元素节点或属性节点。节点是通过沿着路径 (path) 来选取的。XPath在解析HTML\XML文档方面提供了独树一帜的路径思想。

2.3.2 XPath使用步骤

步骤1:导入jar包(dom4j和jaxen-1.1-beta-6.jar)

步骤2:通过dom4j的SaxReader解析器对象,获取Document对象

步骤3: 利用Xpath提供的api,结合xpaht的语法完成选取XML文档元素节点进行解析操作。

document常用的api

  • document.selectSingleNode(“xpath语法”); 获得一个节点(标签,元素)
  • document.selectNodes(“xpath语法”); 获得多个节点(标签,元素)

2.3.3 XPath语法(了解)

  • XPath表达式,就是用于选取HTML文档中节点的表达式字符串。

    获取XML文档节点元素一共有如下4种XPath语法方式:

    1. 绝对路径表达式方式 例如: /元素/子元素/子子元素…
    2. 相对路径表达式方式 例如: 子元素/子子元素… 或者 ./子元素/子子元素…
    3. 全文搜索路径表达式方式 例如: //子元素//子子元素
    4. 谓语(条件筛选)方式 例如: //元素[@attr1=value]
  • 获取不同节点语法

    获取类型语法代码
    获取元素节点元素名称
    获取属性节点@属性名称
2.3.3.1 绝对路径表达式(了解)
  • 绝对路径介绍

  • 以/开头的路径叫做是绝对路径,绝对路径要从根元素开始写

  • public class Test {
        public static void main(String[] args)throws Exception {
            /*
                - document.selectSingleNode("xpath语法");   获得一个节点(标签,元素)
                - document.selectNodes("xpath语法");      获得多个节点(标签,元素)
             */
            // 创建解析器
            SAXReader sr = new SAXReader();
            // 读取xml 获得document对象
            Document document = sr.read("day22/src/tianqi.xml");
            // 得到根元素
            Element rootE = document.getRootElement();
            System.out.println(rootE);
    
            // 绝对路径: 获取深圳 湿度
            Node node = rootE.selectSingleNode("/天气预报/深圳/湿度");
            System.out.println(node.getName());// 湿度
            System.out.println(node.getText());// 50%
    
        }
    }
    	
    
2.3.3.2 相对路径表达式(了解)
  • 相对路径介绍

    • 相对路径就是相对当前节点元素位置继续查找节点,不以/开头, …/ 表示上一个元素, ./表示当前元素

      public class Test {
          public static void main(String[] args)throws Exception {
            /*
                  - document.selectSingleNode("xpath语法");   获得一个节点(标签,元素)
                  - document.selectNodes("xpath语法");      获得多个节点(标签,元素)
               */
              // 创建解析器
              SAXReader sr = new SAXReader();
              // 读取xml 获得document对象
              Document document = sr.read("day22/src/tianqi.xml");
              // 得到根元素
              Element rootE = document.getRootElement();
              System.out.println(rootE);
      
              // 相对路径: 获取深圳 湿度
              Node node = rootE.selectSingleNode("./深圳/湿度");
              System.out.println(node.getName());// 湿度
              System.out.println(node.getText());// 50%
      
      
              //用绝对路径的方式获取“温度”
              Node node2 = document.selectSingleNode("/天气预报/北京/温度");
              // 相对路径: 获取北京 湿度
              Node node3 = node2.selectSingleNode("../湿度");
              System.out.println(node3.getName());// 湿度
              System.out.println(node3.getText());// 20%
      
          }
      }
      
2.3.3.3 全文搜索路径表达式(了解)
  • 全文搜索路径介绍

    • 代表不论中间有多少层,直接获取所有子元素中满足条件的元素

      public class Test {
          public static void main(String[] args)throws Exception {
              /*
                  - document.selectSingleNode("xpath语法");   获得一个节点(标签,元素)
                  - document.selectNodes("xpath语法");      获得多个节点(标签,元素)
               */
              // 创建解析器
              SAXReader sr = new SAXReader();
              // 读取xml 获得document对象
              Document document = sr.read("day22/src/tianqi.xml");
              // 得到根元素
              Element rootE = document.getRootElement();
              System.out.println(rootE);
      
              // 获取天气预报里的所有湿度,不论有多少层
              List<Element> list = rootE.selectNodes("//湿度");
              for (Element e : list) {
                  System.out.println(e.getName()+","+e.getText());
              }
          }
      }
      
2.3.3.4 谓语(条件筛选 了解)
  • 介绍

    谓语,又称为条件筛选方式,就是根据条件过滤判断进行选取节点

    格式:
    ​ String xpath1="//元素[@attr1=value]";//获取元素属性attr1=value的元素

    ​ String xpath2="//元素[@attr1>value]/@attr1"//获取元素属性attr1>value的d的所有attr1的值

    ​ String xpath3="//元素[@attr1=value]/text()";//获取符合条件元素体的自有文本数据

    String xpath4="//元素[@attr1=value]/html()";//获取符合条件元素体的自有html代码数据。

    ​ String xpath3="//元素[@attr1=value]/allText()";//获取符合条件元素体的所有文本数据(包含子元素里面的文本)

2.3.4 演示

public class Test {
    public static void main(String[] args)throws Exception {
        /*
            - document.selectSingleNode("xpath语法");   获得一个节点(标签,元素)
            - document.selectNodes("xpath语法");      获得多个节点(标签,元素)
         */
        // 创建解析器
        SAXReader sr = new SAXReader();
        // 读取xml 获得document对象
        Document document = sr.read("day22/src/tianqi.xml");
        // 得到根元素
        Element rootE = document.getRootElement();
        System.out.println(rootE);

        // 获取最高温度中属性名是level 属性值是A的元素
        List<Element> list = rootE.selectNodes("//最高温度[@level='C']");
        for (Element e : list) {
            System.out.println(e.getName()+","+e.getText());
        }

    }
}

总结

  • 能够说出XML的作用
    作为配置文件
    存储数据,传输数据

  • 了解XML的组成元素
    文档声明
    元素
    属性
    注释
    转义字符
    字符区

  • 能够说出有哪些XML约束技术
    dtd
    schema

  • 能够说出解析XML文档DOM方式原理
    加载整个xml文件—>创建解析器,使用解析器把xml加载成Dom树–>得到Document对象—>获取根元素—>获取子元素…依次类推

  • 能够使用dom4j解析XML文档
    SaxReader read = new SaxReader() :创建解析器
    Document d = read.read(路径) 解析xml文件,得到Document对象
    Element rootE = d.getRootElement(); 获取根元素
    List elements()
    getName()
    getText()
    AttributeValue(String name)

  • 能够使用xpath解析XML
    通过Document对象调用 selectSingleNode(“XPath语法的路径”) 获取指定的元素
    通过Document对象调用 selectNodes(“XPath语法的路径”) 获取多个元素

    1. 绝对路径表达式方式 例如: /元素/子元素/子子元素…
    2. 相对路径表达式方式 例如: 子元素/子子元素… 或者 ./子元素/子子元素…
    3. 全文搜索路径表达式方式 例如: //子元素//子子元素
    4. 谓语(条件筛选)方式 例如: //元素[@attr1=value]
      绝对路径: 以/开头的路径就叫做绝对路径了,绝对路径要从根元素开始
      相对路径: 相对当前标签而言,不以/开头 …/表示上一个元素, ./表示当前元素
      全文搜索路径: 不论有多少层路径,直接获取满足路径的标签
      谓语方式: 条件筛选,根据条件过滤判断进行筛选标签

练习模块

题目

需求:有books.xml,请解析出图书信息,并打印。book.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<books>
       <book id="01" 出版社="传智出版社">
            <name>Java编程思想</name>
            <author>James</author>
            <price>98.00</price>
            <body>库存:30</body>
       </book>
       <book id="02" 出版社="传智出版社">
            <name>JavaEE从入门到精通</name>
            <author>传智播客</author>
            <price>40.00</price>
            <body>库存:20</body>
       </book>
       <book id="03" 出版社="传智出版社">
            <name>Java开发手册</name>
            <author>阿里巴巴</author>
            <price>15.00</price>
            <body>库存:300</body>
       </book>
</books>

参考答案

public class Test01 {
    public static void main(String[] args) throws Exception{
        fun();

    }
    public static  void fun() throws DocumentException {
        SAXReader saxReader  = new SAXReader();
        Document document  =  saxReader.read("book.xml");
        Element root = document.getRootElement();
        List<Element> bookList  = root.elements("book");
        for (Element  bookElement : bookList) {

           List<Element> elements = bookElement.elements();
            for (Element  element : elements) {
                String name = element.getName();
                String text = element.getText();
                System.out.println(name+":"+text);
            }
            System.out.println("=========");
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值