【Java】XML

本文介绍了XML的基本概念,包括其与HTML的区别、存储数据的格式和规则。详细讲解了XML的约束,如DTD和Schema,并对比了两者的区别。接着讨论了XML解析,特别是使用dom4j库进行解析及支持XPath的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML

        可扩展标记语言

        它是一种标记语言 很类似HTML,HTML文件也是XML文档

XML 与 HTML 区别差异

        1.xml标签都是自定义,html标签是预定义

        2.xml语法严格,html语法松散

        3.xml是存储数据的,html是展示数据

存储数据格式:

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="001">
          <name>大珍珠</name>
    </student>
    <student id="002">
        <name>小珍珠</name>
    </student>
</students>

配置文件格式:

<?xml version="1.0" encoding="UTF-8" ?>
<beans>
    <bean classname="com.dzz.bean.User">
        <property name="username" value="jack"></property>
    </bean>
</beans>

xml注意点事项:

        标签由一对尖括号+合法标识符组成        <student>

        标签必须成对出现        <student></student>

        特殊的标签可以不成对称自闭和标签,但是必须有结束标记        <address/>

        标签中可以定义属性,属性和标签名空格隔开属性值必须用引号引起来

        <student id="1" name="大珍珠"></student>

        标签嵌套

        <student id="1">

                <name>大珍珠</name>

        </student>

xml规则:

        xml文件后缀名:xml

        文档声明必须是第一行第一列(定格)

                version:版本

                encoding:字符编码

        必须存在根标签,有且只能有一个

注释:

        ctrl+shift+/

特殊字符:

方式一 转译:

        &lt;        <    小于
        &gt;        >    大于
        &amp;    &    和号
        &apos;    '    单引号
        &quot;    "    引号

方式二 DATA区:

        <![CDATA[   …内容…  ]]> IDEA:CD生成

XML约束

        XML约束主要分2类 DTD Schema 两种约束技术,用来限定xml文件可使用的标签以及属性,也就是告诉程序员xml如何编写

DTD约束

        引入DTD约束

1.引入本地dtd
        <!DOCTYPE 根元素名称 SYSTEM "DTD文件的路径">
2.在xml文件内部引入
        <!DOCTYPE 根元素名称 [ dtd文件内容 ]>
3.引入网络dtd
        <!DOCTYPE 根元素的名称 PUBLIC "DTD文件名称" "DTD文档的URL">

<?xml version="1.0" encoding="UTF-8"?>
        <!--
            传智播客DTD教学实例文档。
            模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
            格式如下:
            <!DOCTYPE beans SYSTEM "bean.dtd">
        -->
        <!ELEMENT beans (bean*,import*) >
        <!ELEMENT bean (property*)>

复杂元素:
直接写子元素名称。
       多个子元素可以使用","或者"|"隔开;
       ","表示定义子元素的顺序 ; 
       "|": 表示子元素只能出现任意一个

简单元素:
EMPTY:	表示标签体为空 
ANY:	表示标签体可以为空也可以不为空 
PCDATA:	表示该元素的内容部分为字符串

        <!ELEMENT property (#PCDATA)>

属性的类型:
CDATA类型:普通的字符串 

        <!ELEMENT import (#PCDATA)>

        <!ATTLIST bean id CDATA #REQUIRED
                className CDATA #REQUIRED
                >

属性的约束:
#REQUIRED:   必须的 
#IMPLIED:    属性不是必需的 
#FIXED value:属性值是固定的

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

        <!ATTLIST import resource CDATA #REQUIRED>

Schema约束

        引入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"
>

解析原理图


Schema和dtd的区别

        1. schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
        2.一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
        3.dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
        4.schema语法更加的复杂

XML解析 

dom4j解析

/*
    第三方工具(jar包)dom4j:
        作用: 以dom的方式,解析xml文件

     使用:
        1.导入jar包
        2.api的介绍
            SaxReader类
            空参构造: public SaxReader(){}  可以直接创建对象

            public Document read(InputStream is): 加载xml文档到内存,生成一个Document对象
            public Element getRootElement(): 获得根元素
            public List<Element> elements(…): 获得指定名称的所有子元素。可以不指定名称
            public String attributeValue(String attributeName):  获得指定属性名的属性值
            public String getText(): 获得当前元素的文本内容

    解析xml文件的步骤:
        1.创建dom4j核心类SaxReader类的对象
        2.dom4j核心类SaxReader类的对象调用read方法,加载xml文件获取对应的Document对象
        3.获取根标签beansElement
        4.获取根标签beansElement中的所有bean子标签,存储List集合对象beanElements
        5.增强for遍历List集合对象beanElements
        5.1 循环内部获取当前bean标签的id和className的属性值
        5.2 循环内部输出5.1中获取的属性值
        5.3 获取当前bean标签的所有property子标签,存储List集合对象propertyElements
        5.4 增强for遍历List集合对象propertyElements
        5.4.1 循环内部获取当前property标签的name和value的属性值,以及文本内容
        5.4.2 循环内部输出5.4.1中获取的属性值及文本内容
 */
public class Demo01ParseXml {
    public static void main(String[] args) throws Exception {
        //1.创建dom4j核心类SaxReader类的对象
        SAXReader saxReader = new SAXReader();

        //使用类加载器获取xml文件对应的字节输入流对象
        InputStream is = Demo01ParseXml.class.getClassLoader().getResourceAsStream("beans.xml");

        //2.dom4j核心类SaxReader类的对象调用read方法,加载xml文件获取对应的Document对象
        Document document = saxReader.read(is);

        //3.获取根标签beansElement
        Element beansElement = document.getRootElement();

        //4.获取根标签beansElement中的所有bean子标签,存储List集合对象beanElements
        List<Element> beanElements = beansElement.elements();

        //5.增强for遍历List集合对象beanElements
        for (Element beanElement : beanElements) {

            //5.1 循环内部获取当前bean标签的id和className的属性值
            String id = beanElement.attributeValue("id");
            String className = beanElement.attributeValue("className");

            //5.2 循环内部输出5.1中获取的属性值
            System.out.println(id + "::::" + className);

            //5.3 获取当前bean标签的所有property子标签,存储List集合对象propertyElements
            List<Element> propertyElements = beanElement.elements();

            //5.4 增强for遍历List集合对象propertyElements
            for (Element propertyElement : propertyElements) {

                //5.4.1 循环内部获取当前property标签的name和value的属性值,以及文本内容
                String name = propertyElement.attributeValue("name");
                String value = propertyElement.attributeValue("value");
                String text = propertyElement.getText();

                //5.4.2 循环内部输出5.4.1中获取的属性值及文本内容
                System.out.println("\t\t" + name + "-----" + value + "-----" + text);
            }
        }

        is.close();
    }
}

 使用dom4j支持xpath解析

/*
    第三方工具(jar包)XPath:
        作用: 快速查找xml文件中的一个/多个节点
        注意: 必须依赖于dom4j
     使用:
        1.导入jar包
        2.api的介绍
            SAXReader类
            空参构造: public SAXReader(){}  可以直接创建对象
            public Document read(InputStream is): 加载xml文档到内存,生成一个Document对象
            public List<Node> selectNodes("xpath表达式"),用来获取多个节点
            public Node selectSingleNode("xpath表达式"),用来获取一个节点
    xpath表达式常用查询形式
        1.//AAA//DDD//BBB: 表示一层一层的,AAA下面 DDD下面的BBB
        2.//BBB: 表示和这个名称相同,表示只要名称是BBB 都得到	BBB指的是标签名
        3./*: 所有元素
        4.查看第一个/最后一个元素
            BBB[1]:表示第一个BBB元素
            BBB[last()]:表示最后一个BBB元素
        5.//BBB[@id]: 表示只要BBB元素上面有id属性 都得到
        6.//BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1
    练习:
		1.查询所有student标签
		2.查询所有student标签下的name标签
		3.查询student标签下带有id属性的name标签
		4.查询student标签下带有id属性的name标签 并且id属性值为itcast
 */
public class Demo02XPathXml {
    public static void main(String[] args) throws Exception {
        //创建dom4j核心类的对象
        SAXReader saxReader = new SAXReader();

        //使用类加载器获取xml文件的对应的字节输入流对象
        InputStream is = Demo02XPathXml.class.getClassLoader().getResourceAsStream("students.xml");

        //加载xml文件获取对应的Document对象
        Document document = saxReader.read(is);

        //1.查询所有student标签
        List<Node> nodeList = document.selectNodes("//student");
        //遍历
        for (Node node : nodeList) {
            System.out.println(node);
        }

        System.out.println("--------------");

        //2.查询所有student标签下的name标签
        nodeList = document.selectNodes("//student//name");
        //遍历
        for (Node node : nodeList) {
            System.out.println(node);
        }

        System.out.println("--------------");

        //3.查询student标签下带有id属性的name标签
        Node node = document.selectSingleNode("//student//name[@id]");
        System.out.println(node);

        System.out.println("--------------");

        //4.查询student标签下带有id属性的name标签 并且id属性值为itcast
        node = document.selectSingleNode("//student//name[@id='itcast']");
        System.out.println(node);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值