XML学习笔记

概述
  • 概念:指可扩展标记语言(EXtensible Markup Language)
    可扩展:标签是都是自定义的
  • xml功能:
    • 存储数据:
      配置文件
      网络中传输
  • xml与html区别
    • xml标签都是自定义的,html的标签是预定义好的
    • xml语法非常严格,html语法松散
    • xml存储数据,html展示数据
语法
  • 基础语法:

    • xml的文档后缀名 .xml
    • xml第一行必须定义为文档声明
    • xml文档中有且仅有一个根标签
    • 属性值必须使用引号(单双都可以)包裹起来
    • 标签必须正确关闭
    • 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>29</age>
            <gender>male</gender>
        </user>
    </users>
  • 组成部分:

  1. 文档声明
    1.1 格式:<?xml 属性列表 ?>
    1.2 属性列表:
    • version:版本号,必须的属性
    • encoding:编码方式,告知解析引擎当前文档使用的字符集,默认值是ISO-8859-1
    • standalone:是否独立(yes/no
  2. 指令:结合css用的,用来展示数据
    <?xml-stylesheet type='text/css' href="css文件地址" ?>
  3. 标签:标签名称是自定义的
    3.1 规则:
    • 名称可以包含数字,字母及其他的字符
    • 名称不能以数字或者标点符号开头
    • 名称不能以字母xml(或者XML Xml 等等)开头
    • 名称不能包含空格
  4. 属性:id属性值唯一
  5. 文本
    5.1 CDATA区:该区内的数据会被原样注释
    格式:<![CDATA[ if(a>b && a<c){} ]]>
约束
  • 概述:规定xml文档的属性规则
    * 作为框架的使用者(程序员):
    	* 能够在xml中引入约束文档
    	* 能够简单的读懂约束文档
  • 分类:
    • DTD:简单的约束技术
    • Schema:复杂的约束技术
  • DTD:
  1. 引入dtd文档到xml文档中
    1.1 内部的dtd,将约束的规则定义在xml文档中
    1.2 外部的dtd,将约束的规则定义在dtd文件中
    • 本地的:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
    • 网络的:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置url">
    <!-- 内部约束
    <!DOCTYPE students [ -->
    	<!--一下5行是约束规则-->
    	<!--
        <!ELEMENT students (student*) >
        <!ELEMENT student (name,age,sex)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!ATTLIST student number ID #REQUIRED>
        ]>
       --> 
       <!--引入本地外部约束-->
     <!DOCTYPE students SYSTEM "student.dtd">
    <students>
        <student number="s">
            <name>nihao</name>
            <age>56</age>
            <sex>mal</sex>
        </student>
        <student number="b">
            <name>da</name>
            <age>6</age>
            <sex>femal</sex>
        </student>
    </students>
  • Schema

    <!--schema约束文档,xsd格式-->
    <?xml version="1.0"?>
    <!--  elementFormDefault="qualified指定目标名称空间名称-->
    <xsd:schema xmlns="http://www.itcast.cn/xml"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn/xml"  elementFormDefault="qualified">
    <!--    定义students元素,类型为studentsType类型-->
        <xsd:element name="students" type="studentsType"/>
    <!--    定义studentsType类型-->
        <xsd:complexType name="studentsType">
            <xsd:sequence>
    <!--            studentsType类型包含0~N个student元素-->
                <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    <!--    定义studentType类型-->
        <xsd:complexType name="studentType">
    <!--        子元素必须按顺序出现-->
            <xsd:sequence>
    <!--            studentType类型顺序包含子元素name,类型为字符串-->
                <xsd:element name="name" type="xsd:string"/>
    <!--            studentType类型顺序包含子元素age,类型为ageType-->
                <xsd:element name="age" type="ageType" />
    <!--            studentType类型顺序包含子元素sex,类型为sexType-->
                <xsd:element name="sex" type="sexType" />
            </xsd:sequence>
    <!--        studentType类型包含属性number,类型为numberType,该属性是必须的-->
            <xsd:attribute name="number" type="numberType" use="required"/>
        </xsd:complexType>
    <!--    定义类型sexType-->
        <xsd:simpleType name="sexType">
    <!--        该类型是对string进行约束-->
            <xsd:restriction base="xsd:string">
    <!--            指定枚举选项-->
                <xsd:enumeration value="male"/>
    <!--            指定枚举选项-->
                <xsd:enumeration value="female"/>
            </xsd:restriction>
        </xsd:simpleType>
    <!--    定义ageType类型-->
        <xsd:simpleType name="ageType">
    <!--        该类型对integer进行约束-->
            <xsd:restriction base="xsd:integer">
    <!--            范围为0~120-->
                <xsd:minInclusive value="0"/>
                <xsd:maxInclusive value="120"/>
            </xsd:restriction>
        </xsd:simpleType>
    <!--    定义numberType类型-->
        <xsd:simpleType name="numberType">
    <!--        对string类型进行约束-->
            <xsd:restriction base="xsd:string">
    <!--            指定正则表达式-->
                <xsd:pattern value="ITCAST_\d{4}"/>
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:schema>
    <!--student.xml文档-->
    <?xml version="1.0"?>
    <!--
        1.填写xml文档的根元素
        2.引入xsi前缀,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        3.引入xsd文件命名空间,xsi:schemaLocation="http://www.itcast.cn/xml students.xsd"
        4.为每一个xsd约束声明一个前缀,作为标识,xmlns="http://www.itcast.cn/xml"
    -->
    <!--  xsi:schemaLocation="http://www.itcast.cn/xml students.xsd" 指定默认名称空间,指定Schema约束文件-->
    <students xmlns="http://www.itcast.cn/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://www.itcast.cn/xml student.xsd">
    <!--    子元素student,其中number属性是必须的,而且number属性值必须匹配正则表达式ITCAST_\d{4}-->
        <student number="ITCAST_1001">
    <!--        子元素name,内容为任意字符串-->
            <name>zhangSan</name>
    <!--        子元素age,内容必须是0~100之间的整数-->
            <age>20</age>
    <!--        子元素sex,内容必须是male和female其中之一。-->
            <sex>male</sex>
        </student>
        <student number="ITCAST_1002">
            <name>liSi</name>
            <age>25</age>
            <sex>female</sex>
        </student>
    </students>
解析
  • 概述:操作xml文档,将文档中的数据读取到内存中

  • 操作xml文档

    • 解析(读取):操作xml文档,将文档中的数据读取到内存中
    • 写入:将内存中的文档保存到xml文档中。持久化存储
  • 解析xml方式

    • DOM:将标记语言文档一次性加载进内存,在内存中形成一个dom树
      • 优点:操作方便,可以对文档进行CRUD(增,删,改,查)的所有操作
      • 缺点:占内存
    • SAX:逐行读取,基于事件进行驱动的
      • 优点:不占内存
      • 缺点:只能读取,不能增删改
  • xml常见的解析器

    • JAXP:sun公司提供的解析器,支持dom和sax两种思想
    • DOM4J:非常优秀的解析器
    • Jsoup:一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
    • PULL:Android操作系统内置的解析器,sax方式的
  • Jsoup解析器

    • 使用步骤:
    1. 导入jar包
    2. 获取Document对象
    3. 获取对应的标签
    public class JsoupDemo1 {
        public static void main(String[] args) throws IOException {
            // 2.获取Document对象,根据xml文档获取
            // 2.1 获取student.xml的路径(绝对路径)
            // getResource("src目录下相对的文件路径"),下列代码中cn是在src目录下的直接文件夹
            String path = JsoupDemo1.class.getClassLoader().getResource("cn/itcast/xml/schema/student.xml").getPath();
            System.out.println(path);
            Document document = Jsoup.parse(new File(path), "utf-8");
            // 3.获取元素对象 Element
            Elements elements = document.getElementsByTag("name");
            // 3.1 获取第一个name的Element对象
            Element element = elements.get(0);
            // 3.2 获取数据
            String text = element.text();
            System.out.println(text);
        }
    }
    • 对象的使用
      • Jsoup:工具类可以解析html或者xml文档,返回Document对象
    parse方法: 解析html或xml文档,返回Document
    	* static Document	parse​(File in, String charsetName)
    		* 解析html或xml文件
    	* static Document	parse​(String html)
    		* 解析html或xml字符串	
    	* static Document	parse​(URL url, int timeoutMillis)
    		* 通过网络的路径来获取html或xml文件对象
    		* URL url=new URl(网址);
      • Document:文档对象,代表内存中的DOM树
    * 获取Element对象
    	* Elements	getElementsByTag​(String tagName)
    		* 根据标签名称获取元素的集合
    	* Elements	getElementsByAttribute​(String key)
    		* 根据属性名称获取元素的集合
    	* Elements	getElementsByAttributeValue​(String key, String value)
    		* 根据对应的属性名和属性值来获取元素的集合
    	* Element	getElementById​(String id)
    		* 根据id属性值获取唯一的元素		
      • Elements:元素Element对象的集合。可以当ArrayList使用
      • Element:元素对象
        • 获取子元素对象
    	* 获取Element对象
    		*getElementsByTag​(String tagName)
    			* 根据标签名称获取元素的集合
    		*getElementsByAttribute​(String key)
    			* 根据属性名称获取元素的集合
    		*getElementsByAttributeValue​(String key, String value)
    			* 根据对应的属性名和属性值来获取元素的集合
    		*getElementById​(String id)
    			* 根据id属性值获取唯一的元素	
        • 获取属性值
    * String attr​(String key),根据属性名称获取属性值
        • 获取文本内容
    * String text​(),获取文本内容
    * String html​(),获取标签体的所有内容(包括子标签的字符串内容)
      • Node:节点对象
    * 是Document和Element的父类
  • 快速查询方式

    • selector:选择器
    * Elements	select​(String cssQuery) 
    * 语法:参考Selector类中的定义的语法
    • XPath:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言
      • 使用Jsoup的xpath需要额外导入jar包 JsoupXpath-0.3.2.jar
      • 查询w3cschool参考手册使用xpath语法
            // 2.获取Document对象,根据xml文档获取
        // 2.1 获取student.xml的路径
        String path = JsoupDemo2.class.getClassLoader().getResource("cn/itcast/xml/schema/student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
       // 3.根据document对象创建JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        // 4.集合xpath的语法查询
        // 获取所有student标签的集合
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }
        // 查询所有student标签下的name标签
        System.out.println("--------");
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }
        // 查询所有student标签下的带有id属性的name标签
        System.out.println("--------");
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
        // 查询所有student标签下的带有id属性的name标签,id属性值为itcast
        System.out.println("--------");
        List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
        for (JXNode jxNode : jxNodes4) {
            System.out.println(jxNode);
        }
    

参考文档

  1. 关于XML的Schema文件讲解 ——SummerChill
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值