美文网首页
3/30day22_XML_XML约束

3/30day22_XML_XML约束

作者: 蹦蹦跶跶的起床啊 | 来源:发表于2020-04-03 00:20 被阅读0次

    day22_XML_XML约束

    思维导图

    复习

    1.知识点差不多都理解,不知道以后干啥用的,太多了消化不良
                        给框架用的!!     慢慢消化!!!
    反射:
        1.如何获取Class对象
            类名.class
            对象名.getClass();
            Class.forName("包名.类名")
        2.如何通过反射获取构造方法,并使用构造方法
            Class对象.getConstructor(参数类型.class,..);
            Class对象.getConstructors();
    
            Class对象.getDeclaredConstructor(参数类型.class,..);
            Class对象.getDeclaredConstructors();
    
            Constructor对象.setAccessible(true);
            Constructor对象.newInstance(参数);
        3.如果通过反射获取成员方法,并使用成员方法
            Class对象.getMethod(String name,参数类型.class,..);
            Class对象.getMethods(); //获取"public"修饰的所有方法(包括父类继承的)
    
            Class对象.getDeclaredMethod(String name,参数类型.class,..);
            Class对象.getDeclaredMethods();//获取"任意修饰"的所有方法(不包括父类继承的)
    
            Method对象.setAccessible(true);
            Method对象.invoke(对象名,参数);
            
    注解:
        1.定义注解
            public @interface 注解名{
                数据类型 属性名();
                数据类型 属性名() default 默认值;
            }
        2.使用注解
            默认情况下,注解可以用在包上,类上,方法上(构造方法/普通方法),变量上(成员变量/局部变量)
            使用格式:
                @注解名(必须给没有默认值的属性赋值,有默认值可以赋值也可以不赋值)
        3.特殊的属性:value
            a.如果注解只有一个属性,并且叫做value,那么使用该注解时,可以省略value的名字,直接写value的值
            b.如果除了value之外还有其他属性,必须其他属性有默认值,且不重写赋值,
                                            那么使用该注解时,可以省略value的名字,直接写value的值
        4.元注解(了解)
        5.注解的解析(了解)   
    

    今日内容

    • XML
    • XML约束

    XML的学习

    XML概念

    XML的介绍

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

    • XML 是一种标记语言,很类似 HTML,HTML文件也是XML文档 <标签名></标签名>

    • XML 的设计宗旨是传输数据,而非显示数据

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

    • XML 被设计为具有自我描述性(就是易于阅读)。

    • XML 是 W3C 的推荐标准

    XML的版本

    W3C在1988年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本。

    XML与HTML的主要差异

    • XML 不是 HTML 的替代
    • XML 和 HTML 为不同的目的而设计。
    • XML 被设计为传输和存储数据(现在用的json更多),其焦点是数据的内容。
    • HTML 被设计用来显示数据,其焦点是数据的外观。
    • HTML 旨在显示信息,而 XML 旨在传输信息。

    XML的入门小案例

    <?xml version="1.0" encoding="UTF-8"?>
    <person id="110">
        <age>18</age>       <!--年龄-->
        <name>张三</name>   <!--姓名-->
        <sex/>              <!--性别-->
    </person>
    

    XML的作用

    • XML在企业开发中主要有两种应用场景:
      • XML可以存储数据 , 作为数据交换的载体(使用XML格式进行数据的传输)。(现在使用的json更多)
      • XML也可以作为配置文件,例如后面框架阶段我们学习的Spring框架的配置(applicationContext.xml)都是通过XML进行配置的(企业开发中经常使用的)

    XML的语法

    XML的组成元素

    XML文件中常见的组成元素有:文档声明、元素、属性、注释、转义字符、字符区。

    • 文档声明: 作用是说明这是个XML文件

      • 必须写在XML文件的0行0列(左上角)
      • 固定格式: <?xml version="1.0" encoding="UTF-8" ?> 表示为版本, 编码
    • 元素/标签

      • 格式:

        <标签名> </标签名> 或者当没有内容时可以写成 <标签名/>

      • 标签有三部分组成: 由开始标签、元素体、结束标签组成。

      • 元素体:元素体可以是元素,也可以是文本,例如: <person><name>张三</name></person>

      • 空元素:空元素只有标签,而没有结束标签,但元素必须自己闭合,例如: <sex/>

      • 元素/标签的命名要求

        • 区分大小写
        • 不能使用空格,不能使用冒号等特殊符号
        • 不建议以XML、xml、Xml开头
      • 格式化良好的XML文档,有且仅有一个根元素。根元素是指最外层标签

    • 属性

      <person id="110">

      • 属性是元素的一部分,它必须出现在元素的开始标签中
      • 属性的定义格式:属性名=“属性值”,其中属性值必须使用单引或双引号括起来
      • 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
      • 属性名不能使用空格 , 不要使用冒号等特殊字符,且必须以字母开头
    • 注释

      ``

    • 转义字符

      需要用的一些特殊字符时, 可能直接写上这些字符会成为XML语法的一部分, 所以使用转义字符

      字符 预定义的转义字符 说明
      < &lt; 小于
      > &gt; 大于
      " &quot; 双引号
      ' &apos; 单引号
      & &amp; 和号

      如下需要把 < 改为 &lt;

      <message>if salary < 1000 then</message>

      <message>if salary &lt; 1000 then</message>

    • 字符区

      • 需要大量转义字符时, 使用格式
      <![CDATA[
          文本数据
      ]]>
      
      1. CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)
      2. CDATA 部分由 "" 结束;
      • 注意
        CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。
        标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。

    XML文件的约束

    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。

    常见的xml约束:DTD、Schema

    DTD约束

    • 概念:

      DTD约束: 成为文档类型定义, 规定我们在编写XML时具体的标签,子标签, 属性等

    • DTD约束简单入门

      1. 复制编写好的dtd文件到指定文件夹下,
      2. 新建需要编写的XML文件
      3. 将dtd文件中引用规则写入新建的XML文件中 如<!DOCTYPE 书架 SYSTEM "bookshelf.dtd">
      4. 根据dtd文件规则编写xml内容
    • 在企业实际开发中,我们很少自己编写DTD约束文档,通常情况下通过框架提供的DTD约束文档编写对应的XML文档。所以这一知识点的要求是可以根据DTD约束文档内容编写XML文档。

    • DTD的语法

      • DTD的引入

        1. 内部DTD(把DTD内容直接写在XML里面. 这种方法只对当前XML文件有效)

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE 根元素 [...//具体语法]><!--内部DTD-->
          <根元素>
          </根元素>
          
        2. 外部DTD-本地(把DTD文档放在本地系统上, 内部人自己使用)

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE 根元素 SYSTEM "bookshelf.dtd"><!--外部本地DTD-->
          <根元素>
          </根元素>
          
        3. 外部DTD-公共(把DTD文档放在网络上, 一般框架使用较多)

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
          "http://java.sun.com/dtd/web-app_2_3.dtd">
          <web-app>
          </web-app>
          
      • DTD中的数量词

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

        • 语法

          <!ELEMENT 标签名字 标签类型>

        • 标签类型有三种

          (#PCDATA) 被解释的字符串数据

          EMPTY 即空元素,例如


          ANY 即任意类型-

          <!ELEMENT 书名 (#PCDATA)>     <!--"书名"元素体为字符串数据-->
          <!ELEMENT 作者 (#PCDATA)>     <!--"作者"元素体为字符串数据-->
          <!ELEMENT 售价 (#PCDATA)>     <!--"售价"元素体为字符串数据-->
          <!ELEMENT 出版日期 ANY>        <!--"出版日期"元素体为任意类型-->
          <!ELEMENT 版本号 EMPTY>        <!--"版本号"元素体为空元素-->
          
    • DTD中的属性声明

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

    schema约束

    • 概念

      Schema 语言也可作为 XSD(XML Schema Definition)。
      Schema 比DTD强大,是DTD代替者。
      Schema 本身也是XML文档,Schema文档扩展名为xsd,而不是xml。
      Schema 功能更强大,数据类型约束更完善。

    • schema使用

      1. 复制schema约束文件中指定的代码到需要编写的xml文件中.

      2. 我们复制过来的是根标签的开始标签, 需要补充结束标签

      3. 根据约束编写xml文件

    • schema中的 名称空间

      相当于导包一样, 指定是哪个文件中的标签名. 名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。如xsd文件中的<xs:element name='书名'

    • schema 学习的要求

      schema功能比dtd强大,但是编写要比DTD复杂,同样以后我们在企业开发中也很少会自己编写schema文件,需要学会框架提供的xsd约束去编写xml.


    XML解析

    XML解析概述

    就是将XML文件中保存的数据读取出来

    解析方式, 解析器,解析开发包

    解析方式

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

      • 优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
      • 缺点:XML文档过大,可能出现内存溢出
    • SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都触发对应的事件。

      • 优点:处理速度快,可以处理大文件
      • 缺点:只能读,逐行后将释放资源,解析操作繁琐。
    • PULL:Android内置的XML解析方式,类似SAX。

    解析器

    就是根据不同的解析方式提供具体实现。

    解析开发包

    对解析器的繁琐细节 进行了封装. 方便开发人员根据API解析xml文件

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

    Dom4J的基本使用

    • Dom4J 的基本原理

      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对象中。

    • 引入dom4j的jar包

      1. 在模块下创建一个lib文件夹(必须叫lib). 把第三方下的 dom4j 的jar包放入lib文件夹内

      2. 将jar包加载到模块依赖中

    • Dom4J的API

      • 核心类: SAXReader

        new SAXReader()构造器

        Document read(String url)加载执行xml文档

      • Doucument对象的API

        Element getRootElement()获得根元素

      • Element对象的API

        • List elements([String ele] ) 获得指定名称的所有子元素。可以不指定名称(中括号内可以不写)
        • Element element([String ele])获得指定名称第一个子元素。可以不指定名称
        • String getName() 获得当前元素的元素名
        • String attributeValue(String attrName) 获得指定属性名的属性值
        • String elementText(Sting ele)获得指定名称子元素的文本值
        • String getText()获得当前元素的文本内容
    • Dom4J的代码演示

      首先将资料下的常用xml中"books.xml"放入项目目录下

      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>
      

      java中解析xml文件如下

      public class Demo {
          public static void main(String[] args) throws DocumentException {
              SAXReader reader = new SAXReader();
              Document document = reader.read(Demo.class.getResourceAsStream("/books.xml
              //获取根元素 books
              Element elemRoot = document.getRootElement();
       
              //获取根元素的所有子元素 book
              List<Element>list = elemRoot.elements();
              //遍历集合 获取每一个book
              for(Element element : list){
                  //获取book的id属性
                  String id =element.attributeValue("id");
                  System.out.println("id : "+ id);
       
                  //获取book下的所有子元素 name,author,sale
                  List<Element>listElem = element.elements();
                  //遍历集合 获取每一个子元素
                  for(Element elem : listElem){
                      //元素名
                      String name = elem.getName();
                      //文本值
                      String text = elem.getText();
                      System.out.println("--- " + name + " : " + text);
                  }
              }
          }
      }
      

    Dmo4J结合XPath解析XML

    什么是XPath

    XPath是XML 的路径表达式, 可以快速从n层标签中选出需要的标签.(一般都是写好的, 要会使用)

    XPath使用步骤

    • 具体步骤
    1. 导入jar包(dom4j和jaxen-1.1-beta-6.jar)
    2. 通过dom4j的SaxReader获取Document对象
    3. 利用Xpath提供的api,结合xpaht的语法完成选取XML文档元素节点进行解析操作。
    • 和XPath相关的Doucument的常用API
      • List selectNodes("XPath路径表达式")获取符合路径表达式的所有元素集合
      • Element selectSingleNode("XPath路径表达式")获取符合路径表达式的唯一元素

    XPath路径表达式的语法(了解就行)

    • 绝对路径表达式方式

      格式: String xpath="/元素/子元素/子子元素...";

      绝对路径是以“/”开头,一级一级描述标签的层级路径就是绝对路径,这里注意不可以跨层级
      绝对路径是从根元素开始写路径的,这里开头的“/”代表HTML文档根元素,所以在绝对路径中不可以写根元素路径

    • 相对路径表达式

      格式: String xpath1="子元素/子子元素...";//获取相对当前路径元素里面的子元素的选取

    • 全文搜索路径表达式方式(常用的)

      格式: String xpath1="//子元素//子子元素";

      一个“/”符号,代表逐级写路径
      2个“//”符号,不用逐级写路径,可以直接选取到对应的节点,是全文搜索匹配的不需要按照逐层级

    • 谓语(条件筛选)

      格式:

      //元素[test() =value] 表示获取元素的文本值为value的节点

      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()";//获取符合条件元素体的所有文本数据(包含子元素里面的文本)

    Dom4J结合XPaht的代码演示

    public class DemoXpath {
        public static void main(String[] args) throws Exception {
            SAXReader reader = new SAXReader();
            Document document = reader.read(Demo.class.getResourceAsStream("/books.xml"));
            //获取所有的book元素
            List<Element> list = document.selectNodes("//book");
            for (Element ele: list) {
                System.out.println(ele.attributeValue("id"));
            }
     
           //获取id为0002的指定book元素的子标签name的内容
            Element ele = (Element)document.selectSingleNode("//book[@id='0002']/name");
            System.out.println(ele.getText());
        }
    }
    

    今日总结

    学习目标

    1.能够说出XML的作用
        是一种标记语言,主要用于传输数据。
        规范数据格式,使数据具有结构性,便于读写。
        多应用于框架的配置文件。
        
    2.了解XML的组成元素
        文档声明、元素、属性、注释、转义字符、字符区  
        
        文档声明
            <?xml version="1.0" encoding="utf-8" ?>
            1.文档声明必须从文档的0行0列位置开始;
            2.version:指定XML文档版本,必备属性,一般都是1.0
            3.encoding:指定当前文档的编码,可选属性,默认值是utf-8
                  
        元素   
            <元素名></元素名>
            <元素名/>
            1.元素名区分大小写。
            2.普通元素的结构由开始标签、元素体、结束标签组成。
            3.空元素可以没有结束标签
            4.元素体可以嵌套文本或其他元素。
                <元素名>张三</元素名>
                <元素名1>
                    <元素名2></元素名2>
                    <元素名3></元素名3>
                </元素名1>     
            
        属性
            <元素名 属性名="属性值"></元素名>
            1.属性是元素的一部分,它必须出现在元素的开始标签内。
            2.属性的定义格式:属性名=“属性值”,其中属性值必须使用单引或双引号括起来。
            3.一个元素可以有多个属性,但属性不能同名。
            4.属性名必须以字母开头。
    
        注释
            <!--注释内容-->
            注释不能嵌套使用。
        
        转义字符
            为了避免文档结构冲突,一些特殊符号需要使用转义字符表示。
            字符   转义字符   说明
             <     &lt;     小于
             >     &gt;     大于
             "     &quot;   双引号
             '     &apos;   单引号
             &     &amp;    和号
    
        
        字符区
            <![CDATA[
                文本数据
            ]]>
            CDATA中的文本会原样输出,便于直观阅读数据。
            CDATA结构不能嵌套。
              
                 
    3.能够说出有哪些XML约束技术
        DTD约束
        schema约束
    
        
    4.能够说出解析XML文档DOM方式原理
        DOM解析原理:
            解析器会把整个XML加载到内存,并解析成一个文档树的结构,返回一个Document对象。
            通过操作Document对象,就可以实现对XML文件的增删改查。
            
        
    5.能够使用dom4j解析XML文档
        使用前需要在项目或模块下添加dom4j-1.6.1.jar的开发包。
    
        读取XML,生成Document对象:
            SAXReader reader = new SAXReader(); 
            Doucument d = reader.read("xml文件地址") 
            
        获取文档根元素:        
            Element e = d.getRootElement(); 
        
        操作Element对象:
            List elements([String ele] ) 获取当前元素的所有直接子元素。可以不指定名称
            Element element(String name) 获得指定名称第一个子元素。
            String attributeValue(String attrName) 获得指定属性名的属性值
            String elementText(String ele) 获得指定名称子元素的文本值
            String getName() 获得当前元素的元素名
            String getText() 获得当前元素的文本内容
    
    
    6.能够使用xpath解析XML或HTML文档
        需要导入的包:
            dom4j-1.6.1.jar
            jaxen-1.1-beta-6.jar
            
        XPath使用路径表达式来选取文档中的元素或属性。
            绝对路径 :/根元素/子元素/子子元素...
            相对路径 :子元素/子子元素..
                     ./子元素/子子元素..      
            全文搜索 : //子元素//子子元素  
            条件过滤: //元素[@属性名=属性值]
    
        配合表达式查询的常用方法:
            获取多个元素的集合:List selectNodes("xpath表达式")
            获取单个元素: Note selectSingleNode("xpath表达式")
        
    

    综合练习

    根据要求,解析以下book.xml文档

    1. 找到id为002的书,并输出书名
    2. 查询 category=计算机 的图书的数量,并遍历打印书名。
    3. 查询 name=红楼梦 的书对应的类别。(提示:获取父类元素 getParent())。
    4. 统计价格在50元以下的图书数量。
    5. 解析book.xml文档,封装到ArrayList<Book>集合中,再遍历输出集合的元素。
    
    6. 修改作者为黑马程序员的书本,改作者为:传智播客,
    7. 将修改后的xml写出到当前模块src目录下,文件名为book_v2.xml
    

    book.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <bookstore>
        <book id="001" category="计算机">
            <name>Java基础案例</name>
            <author>黑马程序员</author>
            <price>49</price>
        </book>
    
        <book id="002" category="计算机">
            <name>MySQL数据库原理</name>
            <author>黑马程序员</author>
            <price>59</price>
        </book>
    
        <book id="003" category="计算机">
            <name>数据结构与算法</name>
            <author>Allen</author>
            <price>66</price>
        </book>
    
        <book id="004" category="文学">
            <name>三国演义</name>
            <author>罗贯中</author>
            <price>39</price>
        </book>
    
        <book id="005" category="文学">
            <name>红楼梦</name>
            <author>曹雪芹</author>
            <price>39</price>
        </book>
    </bookstore>
    

    Book类

    public class Book {
        private String id;
        private String category;
        private String name;
        private String author;
        private String price;
    
        public Book() {
        }
    
        public Book(String id, String category, String name, String author, String price) {
            this.id = id;
            this.category = category;
            this.name = name;
            this.author = author;
            this.price = price;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getCategory() {
            return category;
        }
    
        public void setCategory(String category) {
            this.category = category;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public String getPrice() {
            return price;
        }
    
        public void setPrice(String price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "id='" + id + '\'' +
                    ", category='" + category + '\'' +
                    ", name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", price='" + price + '\'' +
                    '}';
        }
    }
    

    解析代码

    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import java.io.File;
    import java.io.FileWriter;
    import java.util.ArrayList;
    import java.util.List;
    
    public class BookDemo {
        public static void main(String[] args) throws Exception {
            //读取xml文件,返回DOM对象
            SAXReader reader = new SAXReader();
            Document d = reader.read("day22/src/book.xml");
    
            //1. 找到id为002的书,并输出书名
            String name = d.selectSingleNode("//book[@id='002']/name").getText();
            System.out.println(name);
    
            //2. 查询 category=计算机 的图书的数量,并遍历打印书名。
            List<Element> list = d.selectNodes("//book[@category='计算机']");
            System.out.println("数量为:"+list.size());
            list.forEach(e->{
                //String name2 = e.element("name").getText();
                String name2 = e.elementText("name");//获取每一个name元素的文本
                System.out.println(name2);
            });
    
            //3. 查询 name=红楼梦 的书对应的类别。(提示:获取父类元素 getParent())。
            //获取元素<name>红楼梦</name>
            Element e = (Element)d.selectSingleNode("//book/name[text()='红楼梦']");
            //获取<name>元素的父标签<book>
            Element parent = e.getParent();
            //获取属性值
            String category = parent.attributeValue("category");
            System.out.println("红楼梦的类别是:"+category);
    
    
            //4. 统计价格在50元以下的图书数量。
            //获取所有book的price元素,再获取元素中的文本,即价格
            List<Element> priceList = d.selectNodes("//book/price");
            int count = 0;
            for(Element e2 : priceList){
                String p = e2.getText();
                Integer price = Integer.valueOf(p);
                if(price<=50){
                    count++;
                }
            }
            System.out.println("价格在50元以下的图书数量:"+count);
    
    
            //5. 解析book.xml文档,封装到ArrayList<Book>集合中,再遍历输出集合的元素。
            List<Book> bookList = new ArrayList<>();
            //获取所有book元素的集合
            List<Element> eList = d.selectNodes("//book");
            //遍历每一个book元素
            eList.forEach(e3->{
                String id = e3.attributeValue("id");
                String cate = e3.attributeValue("category");
                String bookName = e3.elementText("name");//获取e3元素的子元素name的文本
                String author = e3.elementText("author");
                String price = e3.elementText("price");
                //创建Book对象
                Book b = new Book(id,cate,bookName,author,price);
                //添加到集合里
                bookList.add(b);
    
            });
            //遍历ArrayList<Book>集合
            bookList.forEach(System.out::println);
    
            //6. 修改作者为黑马程序员的书本,改作者为:传智播客
            //   修改元素文本方法:setText("新内容")
            //获取所有<author>黑马程序员</author>元素
            List<Element> listAut = d.selectNodes("//book/author[text()='黑马程序员']");
            listAut.forEach(eAut->{
                //修改作者
                eAut.setText("传智播客");
            });
            
    
            //7.将修改后的xml写出到当前模块src目录下,文件名为book_v2.xml
            FileWriter f = new FileWriter("day22/src/book_v2.xml");
            d.write(f);
            //刷出数据并关闭流
            f.flush();
            f.close();
        }
    }
    

    相关文章

      网友评论

          本文标题:3/30day22_XML_XML约束

          本文链接:https://www.haomeiwen.com/subject/aobqphtx.html