day11 --> (XML)

1.XML:

 1.概念:

Extensible Markup Language :可扩展标记语言

可扩展:标签都是自定义的。<user>、<student>

2.功能:

存储数据:

1、配置文件

2、在网络中传输

3.xml和HTML的区别:

  1. xml标签都是自定义的,html标签都是预定义的
  2. xml的语法严谨,html语法松散
  3. xml是存储数据的,html是展示数据的

properties :

name=zhangsan

age=23

gender=nan

 

name=lisi

age=24

gender=nv

 

<user id='1'>

  <name>zhangsan</name>

  <age>23</age>

</user>

<user id='2'>

  <name>zhangsan</name>

  <age>23</age>

</user>

w3c : 万维网联盟

4.语法:

基本语法:

  1. xml文档的后缀名:.xml
  2. xml第一行必须定义为文档声明
  3. xml文档中有且仅有一个根标签
  4. 属性值必须私用引号引起来(单双都可)
  5. 标签必须正确关闭
  6. xml标签名称区分大小写

快速入门:

<?xml version='1.0' ?>

<users>
    <user id='1'>
        <name>zhangsan</name>
        <age>23</age>
        <gender>male</gender>
    </user>
    
    <user id='2'>
        <name>lisi</name>
        <age>24</age>
        <gender>female</gender>
    </user>
</users>

 

组成部分:

1.文档声明

1.格式:<?xml 属性列表 ?>

2.属性列表:

1.version : 版本号,【必须的属性,目前1.0】

2. encoding :编码方式,告知解析引擎当前文档使用的字符集,

3.standalone : 是否独立

取值:

yes : 不依赖其他文件,独立的

no : 依赖其他文件

2.指令(了解):结合CSS

3.标签:标签名称自定义的

规则:

  1. 名称可以包含字母、数字以及其他的字符
  2. 名称不能以数字或者标点符号开始
  3. 名称不能以字符 xml(或者XML、Xml 等等)开始
  4. 名称不能包含空格

4.属性:

id属性值唯一

5.文本:

CDATE区:在该区域中的数据会被原样展示【大于号、小于号等一些字符】

格式:<![CDATA[ 数据 ]]>

约束:

规定xml文档的书写规则

作为使用者(程序员):

1、能够在xml中引入约束文档

2、能够简单地读懂约束文档

 

 约束地分类:

1.DTD:一种简单地约束技术

2.Schema:一种复杂地约束技术

 

约束方式一:DTD

引入dtd文档到xml文档中(不同的格式引入的方式不同):

内部dtd : 将约束规则定义在xml文档中

外部dtd: 将约束规则定义在外部的dtd文档中

本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">,SYSTEM表示本地

网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件的名字" "dtd文件的位置URL">

<!ELEMENT students (student*) > <!--根标签为students,里边可以student子标签,*表示可以放无限个-->
<!ELEMENT student (name,age,sex)> <!--student标签中可以出现name,age,sex三个标签,并且按照顺序出现-->
<!ELEMENT name (#PCDATA)> <!--(#PCDATA)表示name、age、sex标签中放地是字符串-->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
<!--表示student标签可以有属性,属性名为number,属性的类型为ID,表示id值唯一, #REQUIRED:表示number属性必须出现-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">

<students>
    <student number="s001">
        <name>zhangsan</name>
        <age>23</age>
        <sex>male</sex>
    </student>
    <student number="s002">
        <name>lisi</name>
        <age>24</age>
        <sex>female</sex>
    </student>
</students>

 

不过dtd文档约束还是有一定的缺陷的,它不能限定标签内的数据类型,比如<age>-15</age>

约束方式二:Schema:

引入Schema约束文档的步骤:

1、填写xml文档的根元素

2、引入xsi前缀(前缀不唯一)

3、引入xsd文件命名空间

4、为每一个xsd约束声明一个前缀,作为表示具体使用的是哪个约束

 

3.解析:操作xml文档,将文档中的数据读取到内存中

操作xml文档

1、解析(读取):将文档中的数据读取到内存中

2、写入:将内存中的数据保存到xml文档中,持久化地存储(不讲解)

解析xml方式:

1.DOM : 将标记语言文档一次性加载进内存,在内存中形成一颗dom树

优点:操作比较方便,可以对文档进行CRUD地所有操作

缺点:消耗内存,不适用于内存较小地设备(手机、冰箱...)

2.SAX : 逐行读取【读完一行就释放】,基于事件驱动的

优点:不占内存

缺点:只能读取,不能增删改

xml常见解析器:

1.JAXP :sun公司提供的解析器,支持dom和sax两种思想

2.DOM4J :一款非常优秀的解析器 【常用】

3.Jsoup :jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

4.PULL : Android操作系统内置的解析器,sax方式

Jsoup的使用:

快速入门,步骤:

1、导入jar包

2、获取Document对象

3、获取对应的标签

public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        //1、导入jar包
        //2、根据xml文档获取Document对象
        //2.1获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //2.2解析xml文档 :加载文档进内存,获取dom树 ---> Document
        Document document = Jsoup.parse(new File(path),"utf-8");
        //3.获取元素对象 Element
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());
        //3.1获取第一个name的Element对象
        Element element = elements.get(0);
        System.out.println(element.text());
    }
}

 

对象的使用:

1.Jsoup : 工具类,可以解析html或xml文档,返回Document

parse :解析html或xml文档,返回Document

parse(File in, String charsetName) : 解析xml或html文件

parse(String html) : 解析html或者字符串

parse(URL url, int timeoutMills) : 通过网络路径获取指定的 html 或 xml ,【参数一:文档路径,参数二:超时时间】

2.Document : 文档对象。代表内存中dom树

主要用来获取Element对象:

getElementById(String id) : 根据id值获取唯一的element对象【属性必须为id才可以获取】

getElementsByTag(String tagName) : 根据标签名称获取元素对象集合

getElementsByAttribute(String key) : 根据属性名称获取元素对象集合

getElementsByAttributeValue(String key,String value) : 根据对应的属性名和属性值获取元素对象集合

3.Elements:元素Element对象的集合,继承自ArrayList类,可以当作ArrayList<Element>来使用

4.Element:元素对象 

1.获取Element子元素对象:

getElementById(String id) : 根据id值获取唯一的element对象【属性必须为id才可以获取】

getElementsByTag(String tagName) : 根据标签名称获取元素对象集合

getElementsByAttribute(String key) : 根据属性名称获取元素对象集合

getElementsByAttributeValue(String key,String value) : 根据对应的属性名和属性值获取元素对象集合

2.获取属性值:

String attr(String key) : 根据属性名称获取属性值

3.获取文本内容:

String text() : 获取文本内容【所有子标签的纯文本内容】

String html() : 获取标签体的所有内容【包含标签 + 文本】

5.Node : 节点对象,是所有对象的”爹“

是Document和Element的父类 : 

快捷查询方式:

1.selector :选择器

使用的方法:Elements select(String cssQuery)

语法:参考Selector类定义的语法:

2.XPath : 

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

注意事项:

1.使用Jsoup的Xpath需要导入额外的jar包

2.查询w3cschool参考手册,使用Xpath的语法完成查询

//Xpath查询
//导入Xpath的jar包
public class JsoupDemo6 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");

        //由于获取到的document对象属于Jsoup,而Jsoup不支持Xpath语法,因此需要创建Xpath jar包下的JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        //接下来就可以结合Xpath的语法进行查询了
        List<JXNode> jxNodes = jxDocument.selN("//student");
/*        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }*/
        //查询所有studnet标签下的name标签
        List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
/*        for (JXNode jxNode : jxNodes1) {
            System.out.println(jxNode);
        }*/
        //查询student标签下带有id属性的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
/*        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }*/
        //查询student标签下带有id属性的name标签,并且id属性值为itcast
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='itcast']");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
    }
}

 

posted @ 2022-10-08 21:12  羽梦齐飞  阅读(36)  评论(0)    收藏  举报