XML_刘锋的博客

XML

概念:

可扩展标记型语言

标记型语言

html就是标记型语言

可扩展

html里面的标签是固定的,每个标签都有特定的含义

xml标签可以自己定义,可以写一些中文的标签

用途

html使用来显示数据

xml也可以来显示数据,但是它的主要功能是为了存储数据

现在有两个版本,1.0和1.1,但是现在用的都是1.0,w3c组织发布的一个技术

xml的应用

1、不同的系统之间传输数据

​ QQ之间的传输的过程:qq消息之间的传输格式,首先在最早的时候,用的是一个字符串来传输数据的,之间有一个传输的规则,程序的可维护性太差了。程序员1开发了这个代码,程序员2看到代码就不知道是什么含义,比如想对程序做一个扩展,增加一个ip地址,别的程序员也看不懂。

​ 后来就使用了xml,

String s = " 

<message id = "1">

	<sender>10000</sender>

	<getter>2000</getter>

</message>

"

有利于程序的维护

2、用来表示生活中有关系的数据

<中国>

	<北京>

		<海淀></海淀>

		<丰台></丰台>

	</北京>

</中国>

3、经常用于配置文件

比如现在连接数据库,肯定要知道数据库的用户名和密码,数据名称

如果要修改数据库的信息,就不需要修改连接数据库的信息,直接修改配置文件的内容就好

xml语法

1、xml文档声明

​ 创建一个文件,后缀名是.xml

​ 必须写文档声明,表示写xml文件的内容(必须写在第一行第一列

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

属性:

version:版本:1.0 1.1 一般使用1.0

encoding:编码的格式,gbk中文简体、utf-8、iso8859-1不包含中文

standalone:值是yes或者no,是否需要依赖其他文件

xml中文的乱码问题:

保存到本地硬盘的时候,文件定义的编码格式和文件存储的格式不一致

2、定义元素(标签)

标签必须有开始和结束

标签可以包含标签的主体,如果标签不含主体,可以在标签内结束

<person></person>

<person/>

标签可以嵌套

<aa>
<bb></bb>
</aa>

一个xml文件有且只有一个根标签,其他的标签都是其下面的标签

在xml中,空格和换行也要被解析,所以在xml代码编写中,不要加多余的空格和换行

<name>刘锋</name>

<name>
刘锋
</name>
<!--这两段代码的含义是不一样的-->

命名规则:

1、区分大小写

2、不能数字或者下划线_开头

3、不能以xml、XML开头

4、不能有空格和冒号

5、可以是中文,不推荐

3、定义属性

<person id1="aaa" ,id2="222"></person>

1、一个标签上可以有多个属性

2、属性名称不能相同

3、属性值一定要用单引号或者双引号引起来

4、属性的命名规范和元素的规范是一致的

4、注释

<!--这是一个注释-->

5、特殊字符

显示结果描述转义字符十进制
空格  
<小于号<<
>大于号>>
&与号&&
"双引号""
单引号''
×乘号××
÷除号&divde;÷

6、CDATA区

解决多个字符频繁转义的操作

写法:

<![CDATA[内容]]>
 <![CDATA[<>!@#$%^&*()]]>

7、处理指令(PI指令)

可以在xml中设置样式

XML约束

DTD(Document Type Definition)

简介

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

分类

DTD可以分为两种:内部DTD、外部DTD

使用
内部
<!DOCTYPE 根元素 [元素声明]>

元素声明语法

  <!ELEMENT 元素名 (子元素1,子元素2,子元素3,子元素4,...)>

数量词

+: 表示出现一次或者多次,至少出现一次

?: 表示出现0次或者1次

*: 表示出现任意次

属性声明语法

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>

属性的类型:

类型描述
CDATA值为字符数据 (character data)
(en1|en2|…)此值是枚举列表中的一个值
ID值为唯一的 id
IDREF值为另外一个元素的 id
IDREFS值为其他 id 的列表
NMTOKEN值为合法的 XML 名称
NMTOKENS值为合法的 XML 名称的列表
ENTITY值是一个实体
ENTITIES值是一个实体列表
NOTATION此值是符号的名称
xml:值是一个预定义的 XML 值

解释
属性的默认值
#REQUIRED属性值是必需的
#IMPLIED属性不是必需的
#FIXED value属性值是固定的
<!DOCTYPE scores[
        <!ELEMENT scores (student+)>
        <!ELEMENT student (name,cores,score)>
        <!ATTLIST student id CDATA #REQUIRED>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT cores (#PCDATA)>
        <!ELEMENT score (#PCDATA)>
        ]>
外部

引入本地:

引入网络:

<?xml version="1.0" encoding="UTF-8"?>
   <!ELEMENT scores (student+)>
   <!ELEMENT student (name,cores,score)>
   <!ATTLIST student id CDATA #REQUIRED>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT cores (#PCDATA)>
   <!ELEMENT score (#PCDATA)>

缺陷:

不可以约束内容


XSD(XML Schema Definition)

是DTD的替代者

不仅可以定义XML文档的结构,还能规范文档的内容

XSD本身也是XML文档

XSD采用XML文档来定义语义约束,比DTD要复杂,但是功能要比DTD强大

​ 支持丰富的数据类型

​ 允许开发者自定数据类型

​ 可读性强

​ 可针对未来的需求进行扩展

XML解析技术

就是对xml进行操作,包括创建xml,对xml文件进行增删查改

常见的xml解析技术:

1、dom解析

就是官方(sun)提供的解析方法,基于xml树,适用于多次访问xml

2、SEX解析

民间的解析方式,基于事件的解析方式,消耗的资源少,使用与数据量较大的xml

3、JDMO解析

开放源代码的,比dom更快

4、DOM4J解析

DOM4J说明文档

https://blog.csdn.net/qq_41860497/article/details/84339091

第三方提供,开源免费,是JDOM的升级版,使用的是接口,而不是实现类

DOM4J解析XML

1、生成xml文件

2、将信息从xml文件中取出

解析xml入口是一个对象,得先拿到一个Document对象

读取xml文件的信息

 // 创建SAXreader对象,用于读取xml文件
        SAXReader reader = new SAXReader();

        // 读取xml文件,得到document文件
        Document document = reader.read(new File("xml\\src\\DTD约束\\scores.xml"));
        System.out.println(document);

        // 获取根元素
        Element rootElement = document.getRootElement();
        String name = rootElement.getName();
        System.out.println(name);

        // 获取根元素下的所有子元素 student
        Iterator<Element> iterator = rootElement.elementIterator();
        while (iterator.hasNext()) {
            Element next = iterator.next(); // student
            // 获取每个student的属性
            Attribute id = next.attribute("id");
            // 属性的值
            String value = id.getValue();
            // 属性的名字
            String name1 = id.getName();
            // 打印输出每一个student的id属性的信息
            System.out.println(name1 + " = " + value);
//            // 获取student元素下的所有子元素
//            Iterator<Element> iterator1 = next.elementIterator();
//            while (iterator1.hasNext()) {
//                Element next1 = iterator1.next();// name cores score
//                Object data = next1.getData();
//                String name2 = next1.getName();
//                // 打印 name cores score内容
//                System.out.println(name2+" : "+data);
//            }

            // 获取特定的子元素
            Element name2 = next.element("name");
            String name3 = name2.getName();
            // 获取值的第一种方法
//            String value1 = name2.getStringValue();
            // 获取值的第二种方法
            String text = name2.getText();
            // 获取值的第三种方法
            Object data = name2.getData();
            System.out.println(name3 + " : " + data);
        }

DOM4J生成xml

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.w3school.com.cn"
            xmlns="http://www.w3school.com.cn"
            elementFormDefault="qualified">
    <xsd:element name="students" type="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="number"/>
    </xsd:complexType>

    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="90"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="number">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="stu_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

引入xsd

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

<students xmlns="http://www.w3school.com.cn"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.w3school.com.cn student.xsd">

    <student number="stu_1525">
        <name>刘锋</name>
        <age>2</age>
        <sex>male</sex>
    </student>

</students>

jsoup解析XML

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

也可以用来解析xml

导入jar包

   // 获取document对象,根据一个xml文档获取
        // 获取book3.xml的path路径
        String path = JsoupDocumentTest01.class.getClassLoader().getResource("book3.xml").getPath();
        // 中文文件名出现乱码的解决办法
        path = java.net.URLDecoder.decode(path, "utf-8");
        // 解析xml或者html文件
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 获取元素对象
        Elements book = document.getElementsByTag("book");
        for (int i = 0; i < book.size(); i++) {
            // 获取文本内容
            String s = book.get(i).text();
            System.out.println(s);
 /**
     * 获取网页的document(java爬虫)
     */
    @Test
    public void getUrlElement() {
        try {
            URL url = new URL("https://www.taobao.com/");
            Document parse = Jsoup.parse(url, 10000);
            System.out.println(parse);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

selector选择器

String path = JsoupSelectorTest01.class.getClassLoader().getResource("book3.xml").getPath();
        // 中文文件名出现乱码的解决办法
        path = java.net.URLDecoder.decode(path, "utf-8");

        Document document = Jsoup.parse(new File(path), "utf-8");

        // 标签选择器
        Elements bName = document.select("bName");
//        System.out.println(bName);

        // 和编写css的时候一样
        Elements book_price = document.select("book price");
//        System.out.println(book_price);

        // id选择器
        Elements select = document.select("#1 bName");
        System.out.println(select);

Xpath解析

导入jar包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值