XML学习笔记

一、基础

1、介绍

1)概念
xml,即Extensible Markup Language,可扩展标记语言。
可扩展:标签都是自定义。
标记语言:由标签构成的语言。

2)功能
存储数据。
a、配置文件。
b、网络中传输。

3)xml与html的区别
a、xml标签都是自定义的,html标签是预定义的。
b、xml语法严格,html语法松散。
c、xml用于存储数据,html用于展示数据。

2、语法

1)基础语法
a、后缀名.xml。
b、xml文件第一行必须定义文档声明。<?xml version="1.0" encoding="UTF-8" ?>
c、xml文档有且仅有一个根标签。
d、属性值必须使用单引号或双引号。<user id="1"></user>
e、xml标签名区分大小写.
f、标签中有内容需要使用<标签名>内容</标签名>,无则使用闭合标签<标签名/>.

示例:

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

<myroot>
    <user id="1">
        <name>小李</name>
        <group name="group_1"/>
    </user>
</myroot>

结果:
在这里插入图片描述

错误示例:
(文档声明没有放置第一行)


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

<myroot>
    <user id="1">
        <name>小李</name>
        <group name="group_1"/>
    </user>
</myroot>

结果:
在这里插入图片描述

补充:
可以直接将xml文件拖入浏览器。

2)组成部分

a、文档声明
——格式:<?xml 属性列表 ?>
——属性列表:version-版本号(必须),encoding-编码方式(默认值:ISO-8859-1),standalone-是否独立(yes:不依赖其它文件,no:依赖其它文件)

b、指令(了解)
——导入css样式,<?xml-stylesheet type="text/css" href="xxx.css" ?>

c、标签

d、属性

e、文本
——CDATA区,该区域的数据原样展示。格式:<![CDATA[内容]]>

示例:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/css" href="test.css" ?>

<root>
    <user>
        <name>小李</name>
        <code>
            <![CDATA[
                <name></name>
            ]]>
        </code>
    </user>
</root>
name {
    color: #0066FF;
}

结果:
在这里插入图片描述

二、约束

1、介绍

约束即规定xml文档的书写规则。例如:程序员编写xml文档中有标签<background-color>blue</background-color>,但是框架不能识别它的含义,因此需要约束文档。
在这里插入图片描述

2、DTD约束(了解)

DTD是一种简单的约束技术。

使用方法:
1)内部DTD(不推荐),即约束规则定义在xml文件中。

示例:
test.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--<!DOCTYPE People SYSTEM "people.dtd" >-->
<!DOCTYPE People [
        <!ELEMENT People (people*) > <!--People:根标签;people*表示people标签数大于等于0-->
        <!ELEMENT people (name,age) > <!--name、age表示people标签的属性-->
        <!ELEMENT name (#PCDATA) > <!--属性类型-->
        <!ELEMENT age (#PCDATA) >
        ] >
<People>
    <people>
        <name>小白</name>
        <age>18</age>
    </people>

    <people>
        <name>小红</name>
        <age>19</age>
    </people>
</People>

2)外部DTD,即约束规则定义在外部dtd文件中。
a、本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件路径">
b、网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名" "dtd文件路径">

本地外部DTD示例:
people.dtd

<!ELEMENT People (people*) > <!--People:根标签;people*表示people标签数大于等于0-->
<!ELEMENT people (name,age) > <!--name、age表示people中的标签,必须按顺序使用-->
<!ELEMENT name (#PCDATA) > <!--类型-->
<!ELEMENT age (#PCDATA) >

test.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE People SYSTEM "people.dtd" >

<People>
    <people>
        <name>小白</name>
        <age>18</age>
    </people>

    <people>
        <name>小红</name>
        <age>19</age>
    </people>
</People>

如果xml文档没有按照dtd的规定书写标签,会导致报错。

缺点:
无法对标签内容进行约束。

3、Schema约束(了解)

Schema是一种复杂的约束技术。相比DTD,能够对标签内容进行约束。

引入格式:

<根标签	
	xmlns:xsi(xsi前缀)
	xsi:schemaLocation(xsd文件命名空间)
	xmlns(为xsd约束声明一个前缀作为标识)>
</根标签>

示例:
student.xsd

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.test.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.test.cn/xml" elementFormDefault="qualified">

    <!--自定义元素,name:标签名,type:类型-->
    <xsd:element name="students" type="studentsType"/>

    <!--自定义组合类型,name:类型名-->
    <xsd:complexType name="studentsType">
        <!--按顺序-->
        <xsd:sequence>
            <!--自定义元素,minOccurs:最少出现次数,maxOccurs:最多出现次数,unbounded:未绑定-->
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <!--自定义组合类型,name:类型名-->
    <xsd:complexType name="studentType">
        <!--按顺序-->
        <xsd:sequence>
            <!--自定义元素,name:标签名,type:类型,xsd:string:字符串类型-->
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <!--自定义属性,use="required":必须使用-->
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>

    <!--自定义简单类型,name:类型名-->
    <xsd:simpleType name="sexType">
        <!--约束数据格式,base:基本数据格式-->
        <xsd:restriction base="xsd:string">
            <!--枚举类型-->
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>

    <!--自定义简单类型,name:类型名-->
    <xsd:simpleType name="ageType">
        <!--约束数据格式,base:基本数据格式-->
        <xsd:restriction base="xsd:integer">
            <!--自定义最小值和最大值-->
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="128"/>
        </xsd:restriction>
    </xsd:simpleType>

    <!--自定义类型,name:类型名-->
    <xsd:simpleType name="numberType">
        <!--约束数据格式,base:基本数据格式-->
        <xsd:restriction base="xsd:string">
            <!--自定义格式-->
            <xsd:pattern value="number_\d{2}"/>
        </xsd:restriction>
    </xsd:simpleType>

</xsd:schema> 

student.xml

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

 <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xsi:schemaLocation="http://www.test.cn/xml  student.xsd"
 			 xmlns="http://www.test.cn/xml"
 		    >
 	<student number="number_01">
 		<name>小白</name>
 		<age>18</age>
 		<sex>male</sex>
 	</student>
		 
 </students>

如果引入多个xsd文件,可能会导致标签重复,因此可以通过前缀区分。
示例:

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

 <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xsi:schemaLocation="
			 http://www.test.cn/xml  student.xsd
			 http://www.test2.cn/xml  student2.xsd
			"
 			 xmlns:a="http://www.test.cn/xml"
 			 xmlns:b="http://www.test2.cn/xml"
 		    >
 	<a:student number="number_01">
 		<a:name>小白</a:name>
 		<a:age>18</a:age>
 		<a:sex>male</a:sex>
 	</a:student>
		 
 </students>

三、解析

1、解析方式

1)DOM解析
DOM即文档对象模型(Doucment Object Model),将标记语言文档一次性加载进内存,形成DOM树。
在这里插入图片描述

优点:
操作方便,可对文档进行CRUD。

缺点:
消耗内存,DOM树占用可能是原文档的很多倍。(一般用于服务端)

2)SAX解析
基于事件驱动,逐行读取。如:<title>内容</title>会分成三行读取,并且读取一行释放一行,即内存中只有一行数据,其中两个标签的对应由事件驱动处理。

优点:
内存占用极低。(一般用于手机端)

缺点:
只能读取,不能CRUD。

2、常用解析器介绍

1)JAXP(不推荐)
官方提供的解析器,效率低。支持DOM、SAX。

2)DOM4J
性能优异、功能强大和极其易使用。支持DOM、SAX。

3)Jsoup
Java的html解析器,可直接解析url地址、html文本。支持DOM、SAX。

4)PULL
Android操作系统内置的解析器,使用SAX方式解析。

3、Jsoup解析器

链接: https://pan.baidu.com/s/1lExrICbo8_1WmhRTHNri1g
提取码:065o

简单使用
1、获取xml路径 类.class.getClassLoader().getResource("xxx.xml").getPath()
2、解析xml Jsoup.parse(new File(path),"xml的编码格式")
3、获取元素对象 document.getXXX("xxx")

主要方法
Jsoup.parse():解析xml
——parse(File,编码)
——parse(URL,超时时间)
——parse(字符串,编码)

示例:

test.xml

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

<People>
    <people id="0">
        <name>小白</name>
        <age>18</age>
    </people>

    <people id="1">
        <name>小红</name>
        <age>19</age>
    </people>
</People>

test.java

package xml_learn.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;

public class test {
    public static void main(String[] args) throws Exception {
        //获取xml文件路径
        String path = test.class.getClassLoader().getResource("xml_learn/jsoup/test.xml").getPath();
        //解析xml,加载文件进内存,获取DOM树
        Document document = Jsoup.parse(new File(path),"utf-8");
        //获取元素对象,返回数组
        Elements elements = document.getElementsByTag("name");

        for (Element el : elements) {
            System.out.println(el.text());
        }
    }
}

输出:

小白
小红

示例:

package xml_learn.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.net.URL;

public class test {
    public static void main(String[] args) throws Exception {
        URL url = new URL("https://baidu.com");
        Document document = Jsoup.parse(url, 10000);
        System.out.println(document);
    }
}

输出:

对象
a、Document:文档对象
b、Element:元素对象
c、Node:节点对象(Document和Element的父类)

快捷查询

a、Selector选择器

示例:

package xml_learn.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;

public class test2 {
    public static void main(String[] args) throws Exception {
        String path = test2.class.getClassLoader().getResource("xml_learn/jsoup/test.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        Elements elements = document.select("people[id=0] name");
        System.out.println(elements.text());
    }
}

输出:

小白

b、XPath
XPath即XML路径语言,用于确定XML文档中的位置。

链接:https://pan.baidu.com/s/1IiddSMkM77nCl5BepU5DMQ
提取码:5xq7

示例:

package xml_learn.jsoup;

import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.File;
import java.util.List;

public class test2 {
    public static void main(String[] args) throws Exception {
        String path = test2.class.getClassLoader().getResource("xml_learn/jsoup/test.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");

        JXDocument jxDocument = new JXDocument(document);
        List<JXNode> jxNodes = jxDocument.selN("//people[@id=0]/name");

        for (JXNode jxNode:jxNodes) {
            System.out.println(jxNode.getElement().text());
        }
    }
}

输出:

小白

4、DOM4J解析器

链接:https://pan.baidu.com/s/12SaGh5fglhIhbuO-rO0kYg
提取码:1s7c

主要方法
saxReader.read(new File(path)):解析xml
document.getXXX():获取元素

示例:

package xml_learn.dom4j;

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

import java.io.File;
import java.util.List;

public class test {
    public static void main(String[] args) throws Exception{
        String path = test.class.getResource("test.xml").getPath();

        //读取文件
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(new File(path));

        //获取根节点
        Element rootElement = document.getRootElement();
        //获取元素
        List name = rootElement.elements("people");

        Element el;

        for (Object obj : name) {
            el = (Element) obj;
            //获取子元素文本
            System.out.println(el.element("name").getText());
        }
    }
}

输出:

小白
小红

其它方法
DocumentHelper.createDocument():创建文档
DocumentHelper.createElement():创建元素
document.addDocType(doc1,doc2,…):创建文档DocType
element.addXXX:添加元素、注释、属性等

输出格式化文档

OutputForamt format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");

XMLWriter writer = new XMLWriter(输出流,format);
writer.write(document);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值