XML学习笔记

XML

Extensible Markup Language 可扩展标记语言,于 1998 年 2 月 10 日成为 W3C (万维网联盟)的推荐标准。

XML 教程 (w3school.com.cn)

XML 用途 | 菜鸟教程 (runoob.com)

1、概念

什么是XML?

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准
  • XML 是不作为的。也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。
  • XML 仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。

XML 与 HTML 的主要差异

  • XML 不是 HTML 的替代。
  • XML 和 HTML 为不同的目的而设计。
  • XML 标签都是自定义的,HTML 标签是预定义
  • XML 被设计为传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。
  • HTML 旨在显示信息,而 XML 旨在传输信息。
  • XML 的语法严格,HTML 语法松散

XML 的用途

XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享。

存储数据

  • 作为配置文件
  • 在网络中传输

2、语法

2.1、基本语法

  • xml文档的后缀名 .xml
  • xml第一行必须定义为文档声明
  • xml文档中有且仅有一个根标签
  • 属性值必须使用引号(单双都可)引起来
  • 标签必须正确关闭
  • xml标签名称区分大小写

2.2、快速入门

<?xml version="1.0" encoding="UTF-8" ?>
<users>
<!--属性值必须使用引号(单双都可)引起来-->
    <user id="1">
        <name>张三</name>
        <age>23</age>
        <gender>male</gender>
    </user>
<!--单个标签必须自闭合-->
    <br/>
    <user id="2">
        <name>李四</name>
        <age>11</age>
        <gender>male</gender>
    </user>
</users>

1、组成部分

1、文档声明

  1. 格式:<?xml 属性列表 ?>
  2. 属性列表:
    • version:版本号,必须的属性
    • encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
    • standalone:是否独立
      • 取值:
        • yes:不依赖其他文件
        • no:依赖其他文件

2、指令(了解)

结合css的

<?xml-stylesheet type="text/css" href="a.css" ?>

3、标签

标签名称自定义的

规则:

  1. 名称可以包含字母、数字以及其他的字符
  2. 名称不能以数字或者标点符号开始
  3. 名称不能以字母 xml(或者 XML、Xml 等等)开始
  4. 名称不能包含空格

4、属性

  • id属性值唯一

  • 属性值必须被引号包围,不过单引号和双引号均可使用。

  • 如果属性值本身包含双引号,可以使用单引号,或者可以使用字符实体

    <gangster name='George "Shotgun" Ziegler'>
    <gangster name="George &quot;Shotgun&quot; Ziegler">
    
  • 属性难以阅读和维护。请尽量使用元素来描述数据。

  • 因使用属性而引起的一些问题:

    1. 属性不能包含多个值(元素可以)
    2. 属性不能包含树结构(元素可以)
    3. 属性不容易扩展(为未来的变化)
    <!--第一个实例中使用了 date 属性:-->
    
    <note date="10/01/2008">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>
    
    <!--第二个实例中使用了 date 元素:-->
    
    <note>
    <date>10/01/2008</date>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>
    
    <!--第三个实例中使用了扩展的 date 元素(推荐):-->
    
    <note>
    <date>
    <day>10</day>
    <month>01</month>
    <year>2008</year>
    </date>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>
    

5、文本

CDATA区:在该区域中的数据会被原样展示

  • 格式: <![CDATA[ 数据 ]]>
  • CDATA 部分不能包含字符串 ]]>。也不允许嵌套的 CDATA 部分。
  • 标记 CDATA 部分结尾的 ]]> 不能包含空格或换行。
<![CDATA[
function matchwo(a,b){
	if (a < b && a < 0) then{
	return 1;
	} else{
	return 0;
	}
}
]]>

6、命名空间

XML 命名空间提供避免元素命名冲突的方法。

1、使用前缀来避免命名冲突

在 XML 中的命名冲突可以通过使用名称前缀从而容易地避免。

该 XML 携带某个 HTML 表格和某件家具的信息:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3cschool.cc/furniture">

<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

</root>
2、xmlns 属性
  • 当在 XML 中使用前缀时,一个所谓的用于前缀的命名空间必须被定义。

  • 命名空间是在元素的开始标签的 xmlns 属性中定义的。

  • 命名空间声明的语法如下。xmlns:前缀="URI"。

  • 命名空间,可以在他们被使用的元素中或者在 XML 根元素中声明

  • 命名空间 URI 不会被解析器用于查找信息。其目的是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间

    指向实际存在的网页,这个网页包含关于命名空间的信息。


2.3、约束

规定xml文档的书写规则

作为框架的使用者(程序员):

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

约束分类:

  1. DTD:一种简单的约束技术,引入dtd文档到xml文档中,会对程序员书写xml时进行约束作用

    DTD 教程 | 菜鸟教程 (runoob.com)

    <!ELEMENT students (student+) >         <!-- 标签名students,至少放1个student子标签 -->
    <!ELEMENT student (name,age,sex)>		<!-- student标签有三个子标签,按顺序出现,有且只有一次 -->
    <!ELEMENT name (#PCDATA)>				<!-- 字符串格式 -->
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT sex (#PCDATA)>
    <!ATTLIST student number ID #REQUIRED>	<!-- 声明student的一个属性名为ID(唯一),类型number,必须出现 -->
    
    • 内部dtd:将约束规则定义在xml文档中

      <!DOCTYPE students [
          <!ELEMENT students (student+) >
          <!ELEMENT student (name,age,sex)>
          <!ELEMENT name (#PCDATA)>
          <!ELEMENT age (#PCDATA)>
          <!ELEMENT sex (#PCDATA)>
          <!ATTLIST student number ID #REQUIRED>
      	]>
      
    • 外部dtd:将约束的规则定义在外部的dtd文件中

      • 本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">

        <!DOCTYPE students SYSTEM "student.dtd">
        
      • 网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">


  2. Schema:一种复杂的约束技术(Spring会用到)

    XML Schema 教程 | 菜鸟教程 (runoob.com)

    引入:

    • 填写xml文档的根元素
    • 引入xsi前缀。 xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    • 引入xsd文件命名空间xsi:schemaLocation = "http://www.itcast.cn/xml student.xsd"
    • 为每一个xsd约束声明一个前缀,作为标识。 xmlns = "http://www.itcast.cn/xml"
    <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              	xmlns="http://www.itcast.cn/xml"
              	xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd">
    

2.4、解析

操作xml文档,将文档中的数据读取到内存中

1、操作xml文档
  • 解析(读取):将文档中的数据读取到内存中
  • 写入:将内存中的数据保存到xml文档中。持久化的存储
2、解析xml的方式
  1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
    • 优点:操作方便,可以对文档进行CRUD的所有操作
    • 缺点:占内存
    • 主要用于服务器端
  2. SAX:逐行读取,读一行,释放一行,基于事件驱动的。
    • 优点:不占内存。
    • 缺点:只能读取,不能增删改
    • 主要用于移动端
3、xml常见的解析器
  1. JAXP:sun公司提供的解析器,支持dom和sax两种思想,比较烂,很少有人用

  2. DOM4J:一款非常优秀的解析器

  3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过

    DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

  4. PULL:Android操作系统内置的解析器,sax方式的。

4、Jsoup

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

JSoup快速入门 - 易百教程™ (yiibai.com)

1、快速入门
  • 步骤:
    1. 导入jar包
    2. 获取Document对象
    3. 获取对应的标签Element对象
    4. 获取数据
<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="1">
        <name>张三</name>
        <age>23</age>
        <gender>male</gender>
    </user>
    <!--单个标签必须自闭合-->
    <br/>
    <user id="2">
        <name>李四</name>
        <age>11</age>
        <gender>male</gender>
    </user>
</users>
public class JsoupDemo1 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1获取Document对象,根据xml文档获取
        //1.1 获取user.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("users.xml").getPath();
        //1.2 解析xml文档,加载文档进内存,获取dom树,指定解析字符集
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //2 获取元素对象集合 Elements
        Elements elements = document.getElementsByTag("name");
        //3 获取第一个name的Element对象
        Element element = elements.get(0);
        //4 获取数据
        String name = element.text();
        System.out.println(name);
    }
}

2、对象的使用

Jsoup:工具类,可以解析html或xml文档,返回Document

parse:解析html或xml文档,返回Document

  • parse(File in, String charsetName):解析xml或html文件的。如上
  • parse(String html):解析xml或html字符串
  • parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象,常见,爬虫

Document:文档对象。代表内存中的dom树

主要用于获取Element对象

  • getElementById(String id):根据id属性值获取唯一的element对象
  • getElementsByTag(String tagName):根据标签名称获取元素对象集合
  • getElementsByAttribute(String key):根据属性名称获取元素对象集合
  • getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合

Elements:元素Element对象的集合。可以当做 ArrayList<Element>来使用


Element:元素对象

  1. 获取子元素对象

    • getElementById(String id):根据id属性值获取唯一的element对象
    • getElementsByTag(String tagName):根据标签名称获取元素对象集合
    • getElementsByAttribute(String key):根据属性名称获取元素对象集合
    • getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
  2. 获取属性值

    • String attr(String key):根据属性名称获取属性值
  3. 获取文本内容

  • String text(): 获取所有子标签的纯文本内容
  • String html(): 获取标签体的所有内容(包括子标签的标签和文本)

Node:节点对象

是Document和Element的父类


3、快捷查询方式

selector:选择器

语法:参考Selector类中定义的语法,跟CSS选择器类似

使用的方法:select(String cssQuery) 返回Elements

public class JsoupDemo3 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1获取Document对象,根据xml文档获取
        //1.1 获取user.xml的path
        String path = JsoupDemo3.class.getClassLoader().getResource("users.xml").getPath();
        //1.2 解析xml文档,加载文档进内存,获取dom树
        Document document = Jsoup.parse(new File(path), "UTF-8");

        //2 查询name标签
        Elements elements = document.select("name");
        System.out.println(elements);
        
        //3 查询id为2的元素
        Elements elements1 = document.select("#2");
        System.out.println(elements1);
    }
}

XPath

XPath即为XML 路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言

  • 使用 Jsoup 的Xpath需要额外导入jar包。 jsoup-1.11.2.jarJsoupXpath-0.3.2.jar都需要导入
  • 查询w3cshool参考手册,使用xpath的语法完成查询 XPath 教程 | 菜鸟教程 (runoob.com)
  • XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

代码举例:

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

<bookstore>

    <book id="1">
        <title lang="eng">Harry Potter</title>
        <price>29.99</price>
    </book>

    <book id="2">
        <title lang="eng">Learning XML</title>
        <price>39.95</price>
    </book>

</bookstore>
public class JsoupDemo4 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, XpathSyntaxErrorException {
        //1获取Document对象,根据xml文档获取
        //1.1 获取bookstore.xml的path
        String path = JsoupDemo4.class.getClassLoader().getResource("bookstore.xml").getPath();
        //1.2 解析xml文档,加载文档进内存,获取dom树
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //2 根据document对象,创建JXDocument对象
        JXDocument jxDocument = new JXDocument(document);
        //3 结合Xpath语法查询
        //4 查询id=2的book的price值
        
        //方法1
        //4.1 获取id=1的book节点,因为selN返回的是List,所以要get(0)
        JXNode jxNode = jxDocument.selN("//book[@id=2]/price").get(0);
        //4.2 将JXNode对象转为Element对象,再调用方法
        Element element = jxNode.getElement();
        String text = element.text();
        System.out.println(text);//39.95

        //方法2
        Object price = jxDocument.selOne("//book[@id=2]/price/text()");
        System.out.println(price);//39.95
    }
}
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]//title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book/price/text() 选取 price 节点中的所有文本
posted @   猫的心情  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示