一、XML起源和目的
- XML 是 Extensible Markup Language 的缩写,即可扩展标记语言。它是一种用来创建的标记的标记语言。1996 年,万维网协会(或者叫 W3C,http://www.w3c.org)开始设计一种可扩展的标记语言,1998 年 2 月,XML1.0 成为了 W3C 的推荐标准
- 使用 XML 标记语言可以做到数据或数据结构在任何编程语言环境下的共享。例如我们在某个计算机平台上用某种编程语言编写了一些数据或数据结构,然后用 XML 标记语言进行处理,那样的话,其他人就可以在其他的计算机平台上来访问这些数据或数据结构,甚至可以用其他的编程语言来操作这些数据或数据结构了。这就是XML标记语言作为一种数据交换语言存在的价值
二、XML与HTML的区别
- XML 和 HTML 都是用于操作数据或数据结构,在结构上大致是相同的,但它们在本质上却存在着明显的区别,它们的区别主要有以下几点:
- 1. 语法要求不同:
- 在HTML中不区分大小写,在XML中对大小写要求非常严格
- XML中必须要有结束标签(必须成对),HTML可以没有结束标签
- 2. 标记不同:HTML使用固有的标记,而XML没有固有标记(下面会有介绍)
- 3. 作用不同:HTML用于显示页面,而XML用于描述页面内容的数据或数据的结构。HTML把数据和显示合在一起,在页面中把这些数据显示出来,而XML则将数据和显示分开
- 1. 语法要求不同:
三、XML的优势
- 每种语言的产生都能完成某些特定的功能,XML 作为一种标记语言也不例外。XML最大的优势在于它能对各种编程语言编写的数据进行管理,使得在任何平台下都能通过解析器来读取 XML 数据
- 它的优势可归纳为以下几点:
- 1. 数据的搜索:在 XML 中可以提取文档中任何位置的数据
- 2. 数据的显示:XML 将数据的结构和数据的显示形式分开,根据需要使数据呈现出多种显示方式。如 HTML、PDF 等格式
- 3. 数据的交换: XML 标记语言的语法非常简单,可以通过解析器在任何机器上解读。并可以在各种计算机平台上使用。逐渐成为一种数据交换的语言
四、XML的使用场景
- 随着 json、protobuf 等协议的继续推出和发展,目前 XML 大多用于本地化场景。主要是 xml 相对于 json 格式,数据冗余度大,解析速度也比不上 json、protobuf 等协议
文件配置
- 比如Android的应用配置文件:
- 比如Java中的pom.xml应用配置文件:
- 比如tomcat中的server.xml应用配置文件:
界面配置
- Android和QT都是用XML来配置界面
- 比如下面是QT的界面配置:
- 比如下面是Android的界面配置:
游戏配置
- 像游戏中的关卡,英雄等级,装备之类,显示框大小,颜色之类等
五、XML文档的组成
- XML 文档也属于纯文本文件,该文档一般如下四部分组成:
- 1. XML 文档的声明(可选的)
- 2. XML 文档类型定义(可选的)
- 3. XML 文档注释(可选的)
- 4. XML 标识及其内容(主体)
演示案例
- 下面是一个XML文件
<?xml version="1.0" encoding="UTF-8"?> <?xml:stylesheet type="text/xsl"href="stu.xsl"?> <!--XML 文档注释: 班级中学生的信息--> <class> <student> <name>Jone</name> <age>20</age> </student> </class>
六、XML的基本语法
- XML 的语法规则既简单又严格,非常容易学习,在使用过程中只需认真仔细,没有多大困难
- 一般 XML 的语法规则大致可归纳为以下几点:
- 1. 结束标记不可忽略:在 HTML 中某个标记有起始标记,却可以没有结束标记, 但在 XML 文档中却不可以
- 2. 区分大小写:在 XML 中严格区分大小写,主要表现在开始标记和结束标记的大小写必须相同。还包括文档的声明部分和文档类型定义部分的大小写区分
- 3. 正确的嵌套包含
- 有很多的XML语法检测/在线格式化工具,例如:https://tool.oschina.net/codeformat/xml/
注释
- 在 XML 中编写注释的语法与 HTML 的语法很相似:
<!-- This is a comment -->
所有XML元素都必须有关闭标签
- 在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签
<p>This is a paragraph</p> <p>This is another paragraph</p>
元素/标签
- 元素是 XML 文档的重要组成部分,在 XML 文档中必须存在元素
- XML 文档的元素一般是由标记头、标记末和标记间的字符串数据构成,如下代码所示:
- XML 文档中的第一个元素被称为根元素,在任何一个 XML 文档中有且只有一个元素被称为根元素。其余所有的元素都是子元素,子元素必须正确的嵌套在根元素中
- 标记间的字符串数据就是该元素的值。在XML中,如果元素的值中存在空格,那么这些空格将按原样解析出来
XML标签大小写敏感
- XML 元素使用 XML 标签进行定义
- XML 标签对大小写敏感。在 XML 中,标签<Letter>与标签<letter>是不同的
- 必须使用相同的大小写来编写打开标签和关闭标签
必须正确地嵌套
- 在 XML 中,所有元素都必须彼此正确地嵌套:
<b><i>This text is bold and italic</i></b>
- 在上例中,正确嵌套的意思是:由于元素是在 元素内打开的,那么它必 须在元素内关闭。
实体
- 有些字符具有特殊的意义,例如小于号“<”和大于号“>”,因此不能在xml直接使用,需要使用实体来代替
- 预定义实体表如下所示:
- 实体在 XML 文档中的一般引用格式如下:
&实体名;
- 例如:
<?xml version="1.0" encoding="UTF-8"?> <test> <test1> 1 < 2</test1> </test>
属性
- 属性是用来修饰某个元素的。如:
- 关于元素的属性需注意如下几个问题:
- 属性的值必须用引号括起来,如: attribute1=“aa” 或 attribute3=‘aa'
- 元素的属性以名和值成对出现
- 用来修饰同一个元素的属性的属性名不能相同
- 属性值不能包含“&”、“’”、“<”等字符
XML树结构
- XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”
- 一个 XML 文档实例,XML 使用了简单的具有自我描述性的语法:
- 第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(utf-8)
- 下一行描述文档的根元素<note>。接下来 4 行描述根的 4 个子元素(to、from、heading、body)
- 最后一行定义根元素的结尾</note>
<?xml version="1.0" encoding="utf-8"?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
- XML树结构语法如下:
- XML文档必须包含根元素。该元素是所有其他元素的父元素
- XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。所有元素均可拥有子元素
- 父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)
- 所有元素均可拥有文本内容和属性
<root> <child> <subchild>.....</subchild> </child> </root>
- 实例:
七、XML的元素
什么是XML元素
- XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分
- 元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性
- 例如在下面的例子中:
- <bookstore>和<book>都拥有元素内容,因为它们包含了其他元素。 只有文本内容,因为它仅包含文本
- 只有<book>元素拥有属性 (category="CHILDREN")
<bookstore> <book category="CHILDREN"> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore>
元素命名规则
- XML 元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
- 可使用任何名称,没有保留的字词
- 最佳命名习惯:
- 使名称具有描述性。使用下划线的名称也很不错
- 名称应当比较简短,比如:<book_title>,而不是:<the_title_of_the_book>
- 避免 "-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为你需要提取第一个单词
- 避免 "." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性
- 避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)
- XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。 有一个实用的经验,即使用数据库的名称规则来命名 XML 文档中的元素。
八、XML的属性
概述
- 属性概述:
- XML 元素可以在开始标签中包含属性,类似 HTML
- 属性 (Attribute) 提供关于元素的额外信息
- XML 属性
- 属性通常提供不属于数据组成部分的信息。在下面的例子中,文件类型与数据无关, 但是对需要处理这个元素的软件来说却很重要:
<file type="gif">computer.gif</file>
XML属性必须加引号
- 属性值必须被引号包围,不过单引号和双引号均可使用。比如一个人的性别person标签下面两种形式都是可以的
<person sex="female"></person> <person sex='female'></person>
- 注释:如果属性值本身包含双引号,那么有必要使用单引号包围它,就像这个例子:
<gangster name='George "Shotgun" Ziegler'>
- 或者可以使用实体引用:
<gangster name="George "Shotgun" Ziegler">
XML属性与XML元素的对比
- 请看下面两个例子:
- 在第一个例子中,sex 是一个属性
- 在第二个例子中,sex 则是一个子元素
<person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
<person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
- 两个例子均可提供相同的信息
避免XML属性?
- 因使用属性而引起的一些问题:
- 属性无法包含多个值(子元素可以)
- 属性无法描述树结构(子元素可以)
- 属性不易扩展(为未来的变化)
- 属性难以阅读和维护
- 请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息,比如可以类似QT那样用属性标识类别,以及对象名
针对元数据的XML属性
- 有时候会向元素分配ID引用。这些 ID 索引可用于标识 XML 元素,它起作用的方式与 HTML 中ID属性是一样的
- 演示案例,下面的ID仅仅是一个标识符,用于标识不同的便签。它并不是便签数据的组成部分
<messages> <note id="501"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note> <note id="502"> <to>John</to> <from>George</from> <heading>Re: Reminder</heading> <body>I will not</body> </note> </messages>
九、XSD
- XML Schema 是基于 XML 的 DTD 替代者
- XML Schema 描述 XML 文档的结构
- XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)
什么是XML Schema
- XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD
- XML Schema 在 2001 年 5 月 2 日成为 W3C 标准
XML Schema:
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
XML Schema 是 DTD 的继任者,理由如下:
- XML Schema 可针对未来的需求进行扩展
- XML Schema 更完善,功能更强大
- XML Schema 基于 XML 编写
- XML Schema 支持数据类型
- XML Schema 支持命名空间
为什么要使用XML Schema
- XML Schema 比 DTD 更强大
- XML Schema 支持数据类型,通过对数据类型的支持:
- 可更容易地描述允许的文档内容
- 可更容易地验证数据的正确性
- 可更容易地与来自数据库的数据一并工作
- 可更容易地定义数据约束(data facets)
- 可更容易地定义数据模型(或称数据格式)
- 可更容易地在不同的数据类型间转换数据
- XML Schema 使用 XML 语法,好处有:
- 不必学习新的语言
- 可使用 XML 编辑器来编辑 Schema 文件
- 可使用 XML 解析器来解析 Schema 文件
- 可通过 XML DOM 来处理 Schema
- 可通过 XSLT 来转换 Schema
- XML Schema 可保护数据通信:
- 当数据从发送方被发送到接受方时,其要点是双方应有关于内容的相同的“期望值”。
- 通过 XML Schema,发送方可以用一种接受方能够明白的方式来描述数据。
- 一种数据,比如 "03-11-2004",在某些国家被解释为11月3日,而在另一些国家为当作3月11日。
- 但是一个带有数据类型的 XML 元素,比如:<date type="date">2004-03-11</date>,可确保对内容一致的理解,这是因为 XML 的数据类型 "date" 要求的格式是 "YYYY-MM-DD"
- XML Schema 可扩展:XML Schema 是可扩展的,因为它们由 XML 编写。通过可扩展的 Schema 定义,您可以:
- 在其他 Schema 中重复使用您的 Schema
- 创建由标准类型衍生而来的您自己的数据类型
- 在相同的文档中引用多重的 Schema
<schema>元素
- <schema> 元素是每一个 XML Schema 的根元素:
<?xml version="1.0"?> <xs:schema> ... ... </xs:schema>
- <schema> 元素可包含属性。一个 schema 声明往往看上去类似这样:
- xmlns:xs:指当前xsd所要遵循的标签规范,一般是http://www.w3.org/2001/XMLSchema
- xmlns:一般值为targetNamespace,作用是注明文件内引用类型时的命名空间,防止与其他xsd混淆
- xmlns:?:引用其它命名空间,一般要与import同时使用,之后可以在文件内调用其它文件的类型
- targetNamespace:当前xsd的命名空间,由作者自定义,供XML调用
- elementFormDefault(qualified/unqualified):使用qualified即可,配置更清晰简单
- attributeFormDefault(qualified/unqualified)
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" xmlns="http://www.w3school.com.cn" elementFormDefault="qualified"> ... ... </xs:schema>
演示案例
- 下面是一个名为note.xsd的XML Schema文件:
- note 元素是一个复合类型,因为它包含其他的子元素
- 其他元素 (to, from, heading, body) 是简易类型,因为它们没有包含其他元素
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" xmlns="http://www.w3school.com.cn" elementFormDefault="qualified"> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
- 以下文件包含对 XML Schema 的引用:
<?xml version="1.0"?> <note xmlns="http://www.w3school.com.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3school.com.cn note.xsd"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
十、C++ XML解析库(TinyXml2库)
- TinyXML2 是简单实用的开源的 C++XML 文件解析库,可以很方便的应用到现有的项 目之中
- 具体使用参阅:https://blog.csdn.net/qq_41453285/article/details/106726476