介绍

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

  • 可扩展:标签都是自己定义的。<apple></apple>
  • 标记语言:就是由标签组成的

作用

  • 配置文件,保存了一些数据
  • 网络数据的交互。将数据保存在xml进行网络交互。(就是定义数据格式(json也可以做网络交互),A公司获取B公司的数据)

xml与html的区别

  • xml标签都是自定义,HTML标签是预定义(官方把标签定义好了)。
  • xml语法严格,html语法松散。
  • xml用来存储数据,html用来展示数据。

xml语法规则

  • xml文档后缀名是.xml
  • xml第一行必须是文档声明
  • xml文档中有且只有一个根标签
  • 属性值必须用引号引起来
  • 标签必须正确关闭
  • 标签名区分大小写
<!--文档声明-->
<?xml version="1.0"?>

<beans>
	<bean>abc</bean>
	<apple id="apple">apple</apple>
	<apple id="apple2">apple2</apple>
</beans>

xml组成部分

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 1. 上面那个是文档声明 -->

<!-- 根标签 -->
<!-- 2.元素 -->
    <!-- <bananas></bananas> -->
    <!-- 自闭标签 <img /> -->
    <!-- 元素体可以是标签,还可以是文本 -->
    <!--标签体不能以数字、标点开头-->
<bananas>

    <!-- 属性 -->
    <banana id="banana">
        <!-- 转义字符 -->
        <!--
            < &lt;
            > &gt;
            & &amp;
            " &quot;
            ' &apos;
        -->
    </banana>

</bananas>

xml约束

xml虽然可以自己定义标签属性,但是如果想要做的更好,交互性更强,需要被约束。

有人去定义规范,定义规范的文档就叫约束文档。

常用的约束文档有两种

  • DTD约束
    一种简单的约束文档

  • Schema约束
    一种复杂的约束文档

定义约束文档的工作一般是由框架的开发者去做,
使用框架的开发者

  • 能够在xml中引入约束
  • 能够读懂简单的约束文档

约束

就是规定xml文件中根元素的名称,子元素的名称个数,以及属性等信息。

简单说,约束就是定义xml书写规范。

dtd约束

bean.dtd

<?xml version="1.0" encoding="UTF-8"?>
        <!--
            模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
            格式如下:<!DOCTYPE beans SYSTEM "bean.dtd">
        -->

<!--
    对beans标签的一个规则
        beans标签可以包含 bean标签 import标签
        * 代表标签可以出现 0 - 无数次
        , 代表顺序关系
        #PCDATA 可以存在标签体
 -->
<!ELEMENT beans (bean*,import*) >
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>


<!ELEMENT import (#PCDATA)>

<!--
    ATTLIST attributeList 属性列表
        id
            CDATA 文本类型
            REQUIRED 必须存在
-->
<!ATTLIST bean id CDATA #REQUIRED
        className CDATA #REQUIRED
>

<!ATTLIST property name CDATA #REQUIRED
        value CDATA #REQUIRED
>

<!ATTLIST import resource CDATA #REQUIRED
>

dtdDemo.xml

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

<!-- 引入约束 -->
<!--
    beans 被约束的xml的根标签必须是beans
    SYSTEM 本地引入
    bean.dtd 约束文件的位置
-->
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
    <bean id="" className=""></bean>
</beans>

schema约束

  • dtd约束文档可以自己定义约束;schema约束文档本身就被w3c官方约束,文件后缀名为.xsd

  • 相比dtd,较新的一种约束

  • 语法更严格,数据类型更多

  • 较为复杂,语法规范比较多

bean-schema.xsd

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

<!--

    模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
    格式如下:
        <beans xmlns="http://www.itcast.cn/bean"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd" >


     targetNamespace 给自己的约束起名

     第一层element代表根标签,beans
        complexType 复杂类型
        simpleType 简单类型
            choice 选择结构    里面声明的元素,没有顺序要求
            sequence 顺序结构   里面声明的元素,有顺序要求
        minOccurs="0" maxOccurs="unbounded" 标签可以出现 0-n 次
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"

        targetNamespace="http://www.cast.cn/bean"
        elementFormDefault="qualified"> <!-- 声明根标签 -->
    <element name="beans">
        <complexType>
            <choice minOccurs="0" maxOccurs="unbounded">
                <element name="bean">
                    <complexType>
                        <sequence minOccurs="0" maxOccurs="unbounded">
                            <element name="property">
                                <complexType>
                                    <attribute name="name" use="required"></attribute>
                                    <attribute name="value" use="required"></attribute>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="id" use="required"></attribute>
                        <attribute name="className" use="required"></attribute>
                    </complexType>
                </element>
                <element name="import">
                    <complexType>
                        <attribute name="resource" use="required"></attribute>
                    </complexType>
                </element>
            </choice>
        </complexType>
    </element>
</schema>

schema-demo.xml

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

<!--
    xmlns ns namespace 名称空间
    xmlns:xsi 规范
    xsi:schemaLocation 约束文件的位置
-->
<beans xmlns="http://www.cast.cn/bean"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.cast.cn/bean bean-schema.xsd">

    <import resource=""/>
    <import resource=""/>
    <bean id="" className="">
        <property name="" value=""/>
    </bean>
    
    <bean id="" className=""></bean>
</beans>

xml解析

常见的解析方式

  • dom解析
    将整个xml文档加载到内存中,形成树状结构 – document文档对象
    优点:结构清晰明了,可以做增删改。
    缺点:文档过大会造成内存溢出。
    开发中常用这种解析方式。

  • sax解析
    逐行扫描,一行一行解析。
    速度快,但是没有结构。

  • pull解析
    类似sax解析,安卓中内置的解析方式。

常见的解析开发包

能解析xml的同时也可以处理html

  • JAXP:sun公司提供支持DOM和SAX开发包
  • JDom:dom4j兄弟
  • jsoup:一种处理HTML特定解析开发包
  • dom4j:比较常用的解析开发包,hibernate底层采用

dom4jAPI

<dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
// 加载执行xml文档
Document read()  

// 获得根元素
Element getRootElement()

// 获得指定名称的所有子元素。可以不指定名称 
elements() 
// 获得指定名称第一个子元素。可以不指定名称 
element() 
// 获得当前元素的元素名
getName()  
// 获得指定属性名的属性值
attributeValue()  
// 获得指定名称子元素的文本值
elementText()  
// 获得当前元素的文本内容
getText() 

demo

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="001" className="cn.cast.demo.User">
        <property name="user" value="jacl"></property>
        <property name="user" value="rose"></property>
    </bean>
    <bean id="002" className="cn.cast.demo.Admin">
        <property name="user" value="admin"></property>
        <property name="user" value="write"></property>
    </bean>
</beans>
package com.example;

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

import java.util.List;

public class Dom4jTest {

    public static void main(String[] args) throws DocumentException {

        // 创建用于读取xml文件的流
        SAXReader saxReader = new SAXReader();

        // 将xml文件加载到内存中,并返回document对象
        Document document = saxReader.read("maven-demo\\bean.xml");

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

        // 获取所有子元素
        List<Element> elements = rootElement.elements();

        // 遍历得到每一个bean元素
        for (Element beanElement : elements) {
            String className = beanElement.attributeValue("className");
            System.out.println(className);

            List<Element> propertyEleList = beanElement.elements();

            for (Element propertyEle : propertyEleList) {
                String name = propertyEle.attributeValue("name");
                String value = propertyEle.attributeValue("value");
                System.out.println(name);
                System.out.println(value);
            }

        }


    }
}

xpath

xpath是用来找标签的,也可以用来找html标签

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student number="heima_0001">
        <name id="itcast">
            <xing></xing>
            <ming></ming>
        </name>
        <age>18</age>
        <sex>male</sex>
    </student>
    <student number="heima_0001">
        <name id="itheima">
            <xing></xing>
            <ming></ming>
        </name>
        <age>18</age>
        <sex>male</sex>
    </student>
    <student number="heima_0002">
        <name>jack</name>
        <age>18</age>
        <sex>female</sex>
    </student>
</students>
package com.itheima.xpath;

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

import java.util.List;

/*
   xpath 就是用来找标签的。
 */
public class XpathDemo {

    public static void main(String[] args) throws Exception {
        //1:创建输入流 将xml读取到内存中形成一个document对象
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read("xml\\student.xml");

       // document  selectNodes(xpath表达式)
        //查询所有student标签
        List<Node> list = document.selectNodes("//student");

//        list.forEach(System.out::println);

//        for (Node node : list) {
//            System.out.println(node);
//        }
        // 查询所有student标签下的name标签
        List<Node> list2 = document.selectNodes("//student/name");

//        list2.forEach(System.out::println);
        // 查询student标签下带有id属性的name标签
        List<Node> list3 = document.selectNodes("//student/name[@id]");
//
//        list3.forEach(System.out::println);
    // 查询student标签下带有id属性的name标签   并且 id为 itcast
        List<Node> list4 = document.selectNodes("//student/name[@id='itcast']");

        list4.forEach(System.out::println);
    }

}

“这一块是海马体,正在萎缩,意味着她剩下的记忆越来越少。阿尔茨海默症使得大脑中的某种蛋白物质分泌过多,最后这个物质会弥漫到她整个大脑,直到什么都不记得了。”陈玉拿出她买的脑科学书,翻到一页彩色的大脑图,指着最中间的小小一块,想象妈妈大脑中正在发生的病变。

https://new.qq.com/omn/20220329/20220329A0AQ0000.html?pgv_ref=aio2015&ptlang=2052

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐