3/30day22_XML_XML约束

2020-04-03  本文已影响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的版本

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的入门小案例

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

XML的作用

XML的语法

XML的组成元素

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


XML文件的约束

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

常见的xml约束:DTD、Schema

DTD约束

schema约束


XML解析

XML解析概述

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

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

解析方式

解析器

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

解析开发包

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

Dom4J的基本使用

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

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路径表达式的语法(了解就行)

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();
    }
}
上一篇下一篇

猜你喜欢

热点阅读