Java:42-XML介绍

XML介绍

XML即可扩展标记语言(Extensible Markup Language)
W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用
同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本
W3C是万维网联盟,HTML和XML都是来自他手
特点-----------------------
可扩展的,标签都是自定义的,语法十分严格
XML的作用-------------------------

在这里插入图片描述

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!-- utf-8大写和小写都可以
versioin:指定XML文档版本,必须要写的属性,且我们不会选择1.1,只会选择1.0
encoding:指定当前文档的编码,可选属性,默认值是utf-8
解码:变成二进制,编码:二进制变成内容
-->
<users> <!-- 必须只有一个根元素(最外面的元素,只有一个,且必须有)
在这里是users
在他里面的都叫做标签,如user标签,标签可以有多个,标签里可以写文本或者再写标签(两者都可以写)
若一个标签里有标签,那么这个标签可以叫做元素体或元素,单个标签也可以叫元素,看你怎么说
在这里统称为标签(除了根元素,也可叫根标签)
且标签的名字可以重复
但是标签是区分大小写的,如Name不是name

<user>叫做开始标签,user就叫做标签名,可以随便写
</user>叫做结束标签,必须跟开始标签名一样
-->


    <user id="123" number=""> <!-- 标签后面写的内容,叫做属性-->
        <Name>张百万
            <name></name> <!-- 像这个没有值,且占一行的就类似与<name/>,即叫做空标签,界面显示为<name/>
        -->
            <name/> <!-- 界面显示为<name/>-->
            <name>
            </name> <!-- 只要不占一行,就不是空标签
  只不过没有值而已(对值来说,可以说是空标签,看你怎么说)
            界面显示为<name> </name> -->
        </Name> <!--这个"张百万"这个值,叫做文本-->

        <age>15</age>
    </user>

    <user id="456">
        <name>小斌</name>
        <age>18</age>
        <hobby>
            <pingpang>

            </pingpang>
        </hobby>
    </user>

    <!-- 空元素 没有结束标签 -->
    <close/>
</users>


<!-- XML的注释
    1.XML中必须进行文档声明
        version 版本信息
        encoding 编码
    2.xml的文档声明必须写在第一行

    3.XML 中的元素标签 命名规则
        1.标签定义 不能使用空格 或者 冒号
        2.xml标签名称 区分大小写

    4.XML中有且只有一个根元素
    即必须要有元素,且是根,否则报错

    5.元素体 可以是文本 或者 还是一个标签

    6.属性是元素的一部分 只能出现在元素的开始标签中
        属性值必须使用单引号或者双引号包裹
        一个元素标签可以定义多个属性
-->

<?xml version="1.0" encoding="UTF-8" ?>
<employees>

    <employee eid="2">
        <ename>林黛玉</ename>
        <age>20</age>
        <sex></sex>
        <salary>5000</salary>
        <empdate>2010-01-01</empdate>

    </employee>

    <employee eid="3">
        <ename>杜甫</ename>
        <age>40</age>
        <sex></sex>
        <salary>15000</salary>
        <empdate>2010-01-01</empdate>
    </employee>

</employees>

在这里插入图片描述

由于XML的标签是可以随便写的,没有规范
所以在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束
基本各种框架,都可以解析XML,且解析不同的XML
且基本每个框架都有一套XML约束,使得你写的XML按照他的规则书写
而我们通常需要看出这个规则,来使得我们写XML时,框架解析XML,可以对该框架起作用
常见的xml约束:
DTD
Schema
DTD(Document Type Definition),文档类型定义,用来约束XML文档
规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等
开发中,我们不会自己编写DTD约束文档
通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档
常见框架使用DTD约束有:Struts2、hibernate等
<!ELEMENT students (student+) >
        <!ELEMENT student (name,age,sex)>
        <!ELEMENT name (#PCDATA)>
        <!-- name后面必须指定一个类型或者另外一个元素,即元素里必须有值
        如这里指定普通的文本内容,否则报错-->
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!ATTLIST student number ID #REQUIRED><!--ID可以不写,一种规范,用来确定唯一值,可以小写-->

<!--
    ELEMENT 定义元素,所有的dtd的关键字都必须大写,否则报错,如ATTLIST,REQUIRED,而#是对元素的限制
     students (student+):  当xml中引入dtd时,要设置一个元素为根元素,如果设置students,那么他就为根元素
     且只能写他里面的内容,如student,以此内推
     若指定student为根标签,那么也只能写他里面的内容,如name
     注意:内容里有下一个的,若是标签,则必须写,直到没有标签,否则报错,若是内容,则可以不写
     student+ : 根标签中 至少有一个 student子元素
     student (name,age,sex) : student标签中可以 包含的子元素  按顺序出现
     #PCDATA : 普通的文本内容
     ATTLIST : 用来定义属性
     student number ID : student标签中 有一个ID属性 叫做 number
     #REQUIRED : number的属性必须填写
     ID 唯一的值 不能重复 值只能是字母或者下划线开头
-->
引入dtd文档到xml文档中,两种方式
内部dtd:将约束规则定义在xml文档中,写在xml里
外部dtd:将约束的规则定义在外部的dtd文件中
外部:

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<!-- 引入dtd则,受到约束了,必须按照dtd的规则来定义标签-->
<!-- 这个地址可以写相对路径和绝对路径,即可以直接写student.dtd
若只有一个该dtd文件那么
只要最后的路径是student.dtd就可以了,前面的路径位置可以随便写,但是若有多个dtd文件的话,就必须要指定路径了
否则的话,就会优先考虑最近原则,当多个dtd的名字相同时,且不在同一目录,那么谁的路径少用谁的(不指定具体目录的时候),一般在项目下面操作
-->
<students>
    <student number="S1"> <!-- 标签后面写属性的地方,不可以注释 -->
        <name>长海</name>
        <age>20</age>
        <sex></sex>
    </student>

    <student number="S2">
        <name>大玲子</name>
        <age>18</age>
        <sex></sex>
    </student>

</students>
当xml的age标签内容为2000时,明显不合理的,于是就有了更加强大的xml约束Schema,他也可以写xml文件
Schema是新的XML文档约束, 比DTD强大很多,是DTD 替代者
Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml
Schema 功能更强大,内置多种简单和复杂的数据类型,如限制数字大小,对age(年龄)的限制
Schema 支持命名空间 (一个XML中可以引入多个约束文档)
注意对于特定的标签,xml基本都可以写,如Scheam的格式xml也可以写,但需要指定格式使得xml的标签名可以有":"
但基本上这样的格式我们用Schema即xsd来记录
当然dtd的格式,xml是不可以操作的,因为格式完全不同
即xml不可以写dtd,但可以写xsd(需要指定格式),即可以理解为xsd是xml的一种
而对于这两种约束,都可以写xml的,因为xml只是一个内容,基本与后缀无关,而内容是使用的,那么里面的格式也就不能随便写了
<!-- 需要<?xml version="1.0" encoding="UTF-8" ?> -->
但是必须符合xml的格式或者兼容xml格式的才可以写,如java不可以写,不符合或者兼容
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns="http://www.lagou.com/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.lagou.com/xml" elementFormDefault="qualified">
    <!-- xmlns文档命名空间 -->
    <!-- xmlns:xsd Schema自带文档命名空间,当需要使用时,要加xsd,如下面的xsd:string就是他带的
    上面两个说明内容
    -->
    <!-- targetNamespace表示定义的元素来自哪个文档命名空间
     上面三个是一起的,不可缺少,否则报错,依次向后走
     -->
    <!-- elementFormDefault表示定义的元素要有我们命名空间指定

     -->
    <xsd:element name="students" type="studentsType"/>  <!-- 根标签是students
类型是studentsType,studentsType是自定义的 -->
    <xsd:complexType name="studentsType"><!-- 这个类型的作用,引入这个类型-->
        <xsd:sequence><!--标签的内容-->
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
            <!--标签的标签-->
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/><!--标签的属性设置-->
    </xsd:complexType>
    <xsd:simpleType name="sexType"><!--内容的约束-->
        <xsd:restriction base="xsd:string"><!--内容的类型-->
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/><!--该类型约束的具体作用-->
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="200"/><!--该类型约束的具体作用-->
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="hehe_\d{4}"/><!--该类型约束的具体作用-->
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>
<!--
<xsd:schema>:起始
 <xsd:element:元素,type属性相当于是别称,用来操作该标签的内容,可以被引入
使得操作该标签或者给该标签添加内容
 <xsd:complexType:引入type对应的标签,对标签的操作,如加标签<xsd:sequence>,<xsd:attribute
 <xsd:sequence>:标签操作,该标签拥有的标签
 <xsd:attribute:对该标签的属性设置
 schema->根element->complexType->attribute,(sequence->子element)
  <xsd:simpleType:引入type对应的标签,对内容的约束和指定类型<xsd:restriction,如加范围
这里是最后的type,因为是值了
    <xsd:restriction:指定内容类型,里面可以写对应约束标签
  schema->simpleType->restriction

-->
<?xml version="1.0" encoding="UTF-8" ?>
<students
        xmlns="http://www.lagou.com/xml"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.lagou.com/xml student.xsd"
>
  <!--  根元素来自哪个命名空间,使用xmlns指令来声明,一般代表第一个schemaLocation的需要对应,只要能访问即可
xmlns="http://www.lagou.com/xml",不写,可能有些操作不会读取或者起作用,即需要他,对应的值可能在一些操作中需要其对应的值,否则可能也操作不了,一般只是标识,而不是命名空间
xmlns:xsi是w3c的命名空间,除了命名空间的作用,一般他是用来区分使用什么或者使用什么约束,一般来说他主要操作xsd,也可能操作dtd,命名空间只是一个可以操作的标签名编写而已,有些需要这样的,否则可能不能使用什么:标签(这是xml的作用,那么有些识别这样并操作的就不行了,一般也包括命名前缀,如xmlns:mvc,就有mvc:,而xsi基本代表所有(一般没有约束的基本都可以随便写)),同样的他也是使用schemaLocation属性的前提,否则没有他就不能使用schemaLocation
     xsi:schemaLocation是命名空间约束文档位置
第一个为命名空间约束位置(这里代表指定命名空间约束位置,即扩展的意思,可以指定多个) 第二个为对应位置的xsd文件的路径(某些框架中下(如Spring),是会判断是否有对应的正确路径的(可能根据标签来判断)或者是否有标签,否则项目不会启动,或者读取不了对应的配置文件而报错,比如Spring不加上:http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd,少其中一个就会报错,对应于主标签和子标签的(所有)部分,并且对应的文件内容是空的也会报错,包括servlet的对应的web.xml也是如此,这其实都是规定,或者说是框架的规定,因为xml是服务的,他的写法一般至少服务于框架,就如前面测试时,我们也并没有这些还是可以操作,所以这里了解即可)
     上面是一起的(三个设置,xmlns开始),不可缺少,否则约束不起作用,依次向后走的,可以说这是规定
命名空间就是可以命名的范围
命名空间是限制你随便写的

这里与dtd不同,dtd是元素规范,有下一个标签必须写,而这里主要是内容规范,则若有下一个标签,可以不写

命名空间只是代表可以写什么而已(一般没有约束的基本都可以随便写,而后面的schemaLocation是约束扩展),约束代表不能写什么
     -->
    <student number="hehe_1234">
        <name>张三</name>
        <age>200</age>
        <sex>male</sex>
    </student>

    <student number="hehe_4567">
        <name>张三</name>
        <age>200</age>
        <!-- 2000不可以了,报错,约束了范围
		约束的地方:
        <xsd:minInclusive value="0"/>
        <xsd:maxInclusive value="200"/>
        -->
       
        <sex>male</sex>
    </student>

</students>

在这里插入图片描述

当将数据存储在XML后,我们就希望通过程序获得XML的内容
如果我们使用Java基础所学习的IO知识是可以完成的,不过你需要非常繁琐的操作才可以完成
且开发中会遇到不同问题(只读、读写)
人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML

在这里插入图片描述

解析器:就是根据不同的解析方式提供的具体实现
有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包
JAXP:sun公司提供的解析器,支持DOM和SAX两种思想
DOM4J:一款非常优秀的解析器 , Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT
它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP,第三方开发出来的解析方式,需要相应jar包
Jsoup:jsoup 是一款Java 的HTML解析器 ,也可以解析XML
PULL:Android内置的XML解析方式,类似SAX
dom4j 的使用-------------

在这里插入图片描述

上面是需要的包
使用核心类SaxReader加载xml文档获得Document,通过Document 对象获得文档的根元素,然后就可以操作了
常用API如下:
SaxReader对象-----------------------------
read(…) 加载执行xml文档
Document对象-----------------------------
getRootElement() 获得根元素
Element对象-----------------------------
elements(…) 获得指定名称的所有子元素,可以不指定名称
element(…) 获得指定名称的第一个子元素,可以不指定名称(一般需要指定)
getName() 获得当前元素的元素名
attributeValue(…) 获得指定属性名的属性值
elementText(…) 获得指定名称子元素的文本值
getText() 获得当前元素的文本内容
若标签下只有标签,其实是有文本的,只不过为空而已
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns="http://www.lagou.com/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.lagou.com/xml" elementFormDefault="qualified">

    <xsd:element name="users" type="usersType"/>
    <xsd:complexType name="usersType">
        <xsd:sequence>
            <xsd:element name="user" type="userType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="userType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="hobby" type="hobbyType" />
        </xsd:sequence>
        <xsd:attribute name="id" type="numberType" use="required"/>
    </xsd:complexType>

    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="100"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="hobbyType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="抽烟"/>
            <xsd:enumeration value="喝酒"/>
            <xsd:enumeration value="烫头"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="\d{3}"/>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema>
<?xml version="1.0" encoding="UTF-8" ?>
<users
        xmlns="http://www.lagou.com/xml"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.lagou.com/xml user.xsd"
>
    <user id="001">
        <name>张百万</name>
        <age>25</age>
        <hobby>抽烟</hobby>
    </user>

    <user id="002">
        <name>于谦</name>
        <age>55</age>
        <hobby>烫头</hobby>
    </user>

    <user id="003">
        <name>小斌</name>
        <age>25</age>
        <hobby>喝酒</hobby>
    </user>


</users>
package com.lagou.xml03;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

public class TestDOM4j {

    //获取XML文件中的 所有的元素名称(标签)
    @Test
    public void test1() throws DocumentException {

        //1.获取XML解析对象
        //核心类SaxReader加载xml文档获得Document
        SAXReader reader = new SAXReader();

        //2.解析XML 获取 文档对象 document
        //read(…) 加载执行xml文档
        Document document = 
            reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml03\\user.xml");
        //不可以有中文,不识别
        //从这里看出,中文做路径是不好的,有些虽然可以使用中文,但大多数的不可以使用

        //3.获取根元素
        //getRootElement() 获得根元素
        Element rootElement = document.getRootElement();

        //获取根元素名称
        //getName() 获得当前元素的元素名
        System.out.println(rootElement.getName());

        //获取 根元素下的标签
        //elements(…) 获得指定名称的所有子元素,可以不指定名称
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            System.out.println("根标签下的子节点: " + element.getName());

            List<Element> eList = element.elements();
            for (Element e : eList) {
                System.out.println("user标签下的子节点" + e.getName());
                //有顺序的
            }

            break;
        }

    }

    //获取XML中标签的文本信息 和 属性信息
    @Test
    public void test2() throws DocumentException {

        //1.获取解析XML的 SAXReader
        SAXReader reader = new SAXReader();

        //2.获取文档对象
        Document document = 
            reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml03\\user.xml");

        //3.获取根节点
        Element rootElement = document.getRootElement();

        //4.获取子节点 user
        List<Element> elements = rootElement.elements();

        //5.获取集合中的第一个 子节点
        Element user = elements.get(0);
        //用get更方便,0下标从0开始,即集合中的第一个,List的方法,大多数语言或者程序,下标都是从0开始的

        //6.获取节点中的文本信息
        //attributeValue(…) 获得指定属性名的属性值
        String id = user.attributeValue("id");//获取属性 id的值
        //elementText(…) 获得指定名称子元素的文本值
        String name = user.elementText("name");
        String age = user.elementText("age");
        //element(…) 获得指定名称的第一个子元素,这个现在必须指定名称了
        String hobby = user.element("hobby").getText();

        //打印
        System.out.println(id + " " + name +" " + age + " " + hobby);
    }
}

XPath 是一门在 XML 文档中查找信息的语言
可以使用xpath查找xml中的内容
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接获取到某个元素

在这里插入图片描述

上面是需要的包

在这里插入图片描述

上述的"//"是无视语法中的路径的
不再是Element对象了,而是节点对象
常用方法:
selectSingleNode(query): 查找和 XPath 查询匹配的一个节点,参数是Xpath 查询串
selectNodes(query):得到的是xml根节点下的所有满足 xpath 的节点,参数是Xpath 查询串
Node:节点对象
<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
    <book id="book1">
        <name>金瓶梅</name>
        <author>金圣叹</author>
        <price>99</price>
    </book>
    <book id="book2">
        <name>红楼梦</name>
        <author>曹雪芹</author>
        <price>69</price>
    </book>
    <book id="book3">
        <name>Java编程思想</name>
        <author>埃克尔</author>
        <price>59</price>
    </book>
</bookstore>
package com.lagou.xml04;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

public class TestXPath {

    /*
    *  使用selectSingleNode() 方法 查询自定的节点信息
    *
    * */
    @Test
    public void test1() throws DocumentException {

        //1.创建XML解析对象
        SAXReader reader = new SAXReader();

        //2.解析XML 获取 文档对象
        Document document = 
            reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml04\\book.xml");

        //3.通过selectSingleNode() 方法获取 name节点
        //selectSingleNode(query): 查找和 XPath 查询匹配的一个节点,参数是Xpath 查询串
        //查到是第一个,即按顺序来,无论你的语法如何,都只获得一个,如//name也是获得第一个
        Node node1 = document.selectSingleNode("/bookstore/book/name");
        //该路径是Xpath查询串,简称语法路径
        //该节点可以理解为得到的name标签
        //注意:这里用反斜杠\会报错,转义的也不可以,必须正斜杠/,而文件可以使用转义的反斜杠(\\)
        //但没转义的不可
        //获得元素名
        System.out.println("节点的名称: " + node1.getName());
        //获得元素文本内容
        System.out.println("书名: " + node1.getText());

        //4.获取第二本书的书名
        Node node2 = document.selectSingleNode("/bookstore/book[3]/name"); //下标从一开始,不是0
        System.out.println("书名: " + node2.getText());
    }


    /*
    * 使用 selectSIngleNode() 方法获取 属性值 或者 通过属性值获取到节点信息
    *
    * */
    @Test
    public void test2() throws DocumentException {

        SAXReader reader = new SAXReader();

        Document document = 
            reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml04\\book.xml");

        //1.获取第一个book节点中的  id属性的值
        Node node1 = document.selectSingleNode("/bookstore/book/attribute::id");
        //attribute::id表示book的id属性,且是第一个,一个/代表从根节点开始,所以若对应操作的/后面没有,那么通常会报错(后面的因为null),如果不加/那么代表当前节点的子节点,当然,没找到自然容易报错,这是因为没有找到返回null,那么node1.getText()报错
        System.out.println("第一个book的id属性值: " + node1.getText() );

        //2.获取最后一个book节点的 id属性值
        Node node2 = document.selectSingleNode("/bookstore/book[last()]/attribute::id");
        //最后一个book的id属性
        System.out.println("最后一个book节点中的属性值: " + node2.getText());
        //在XPath里getTest()不只是可以用来获取标签内容,也可以获取属性内容

        //3.通过id的值 获取book2节点 中的书名
        Node node3 = document.selectSingleNode("/bookstore/book[@id='book2']");

        String name = node3.selectSingleNode("name").getText();
        //节点可以继续使用语法来操作,即可以不用指定路径,而是指定自己所拥有的标签名
        //当然你也可以重新指定路径,来改变指向,即改变节点
        //即当你遇到多个相同id时,可以先用list获得他们(使用selectNodes()方法)
        //然后一个一个的继续使用节点操作
        //这样的方法,可以使得,你一次性获得所有信息,而不用修改语法了
        //语法:双引号里面的格式(操作)
        System.out.println("id为book2的 节点的书名是: " + name);

    }

    /*
    *  使用selectNodes() 获取所有指定名称 的节点
    *
    * */
    @Test
    public void test3() throws DocumentException {

        SAXReader reader = new SAXReader();

        Document document = 
            reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml04\\book.xml");

        //1.查询所有的节点
        //selectNodes(query):得到的是xml根节点下的所有满足 xpath 的节点,参数是Xpath 查询串
        //只要满足,都要获得,如/bookstore/book,获得所有的book,即长度为3,因为有三个满足条件
        //或者//book,无视语法路径,也有三个满足的book
        List<Node> list = document.selectNodes("//*");
        //记住:包括根节点
        //即代表所有

        for (Node node : list) {
            System.out.println("节点名: " + node.getName());
        }
        //获取时,从第一个开始,以此类推

        //2.获取所有的书名
        List<Node> list1 = document.selectNodes("//name");
        //当
        //a//b时是先从第一个a开始(一般也有多个a),然后取多个b,这样就符合所有
        for (Node node : list1) {
            System.out.println("书名: " + node.getText());
        }

        //3.获取 id值为 book1 的节点中的所有内容
        List<Node> list2 = document.selectNodes("/bookstore/book[@id='book1']//*");
        //只能用单引号了,双引号会连接
        for (Node node : list2) {
            System.out.println(node.getName() + " = " + node.getText());
        }
    }
}

 list = document.selectNodes("//*");
        //记住:包括根节点
        //即代表所有

        for (Node node : list) {
            System.out.println("节点名: " + node.getName());
        }
        //获取时,从第一个开始,以此类推

        //2.获取所有的书名
        List<Node> list1 = document.selectNodes("//name");
        //当
        //a//b时是先从第一个a开始,然后取多个b,这样就符合所有
        for (Node node : list1) {
            System.out.println("书名: " + node.getText());
        }

        //3.获取 id值为 book1 的节点中的所有内容
        List<Node> list2 = document.selectNodes("/bookstore/book[@id='book1']//*");
        //只能用单引号了,双引号会连接
        for (Node node : list2) {
            System.out.println(node.getName() + " = " + node.getText());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值