L o a d i n g . . .
SHIWIVI-文章

//sunny forever
while(life<end){
love++;
beAwesome :)}

    <
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

xml

字数:6557 写于:2023-05-25
最新更新:2023-05-25 阅读本文预计花费您19分钟

简介

关于

XML 指可扩展标记语言(EXtensible Markup Language),其文件以.xml为后缀名,主要用于数据存储、数据传输、编写配置文件,语法格式与HTML相似,二者主要差异有:

  • XML标签没有被预定义,需要自行定义标签;HTML虽然支持自定义标签,但主要使用预定义标签
  • XML主要用于传输和存储数据,HTML主要用于显示数据
  • XML语法要求比HTML严格

组成

xml文档基本由以下模块组成

  • 标签(元素):文档主要部分,将被解析为XML DOM
  • 标签属性:提供关于标签的信息
  • 转义字符(实体):XML中预用字符的实体引用
  • PCDATA(Parsed Character Data):需要由解析器解析的文本
  • CDATA(Character Data):解析器不会解析的文本,内容将视为字符串

语法

xml标签定义规范

xml中的标签需要自定义,标签名需要遵循以下规范

  • 可以包含字母、数字和其他符号,包括连字符(-)、下划线(_)和点号(.)
  • 不能以数字或者标点符号开始
  • 不能以xml、 XML、Xml开始
  • 不能包含空格
  • 尽量避免使用-.字符,该类字符在某些XML解析器中中可能会被错误解析
  • 避免使用:,该字符用于命名空间

xml基本语法格式

<?xml version="1.0" encoding="utf-8"?> <web> <author>SHIWIVI</author> <license>CC BY-NC</license> <heading><type>Document</type></heading> <body>Meet you like the wind</body> </web>
  • 首行进行xml文档声明,version属性定义版本,encoding声明编码格式
  • 必须包含一个根标签,标签名自定义
  • XML标签大小写敏感
  • 所有XML标签都必须闭合,自闭合标签禁止省略/
  • XML的属性值须加引号,即便属性值是数值,单双引号均可用
  • XML标签禁止交叉嵌套
  • XML中多个连续空格也会被保留,HTML中会被合并
  • XML 以 LF 存储换行
xml正确嵌套: <a><b>content</b></a> 严禁交叉嵌套: <a><b>content</a></b>
空标签

xml允许空标签,即标签中无内容

<element></element> 空标签可以使用自闭合,但禁止省略 / <element />

转义字符

以下字符在XML中被预定义,使用时需要转义

字符 转义 字符 转义
< &lt; ' &apos;
> &gt; " &quot;
& &amp;

CDATA字符数据

CDATA(character data)指不被xml解析器解析的文本数据,当文档中出现需要大量转义的字符时,可以直接使用CDATA进行引用,这样,这些字符将不会被xml解析器解析,

CDATA 部分由<![CDATA[开始,]]>结束

<root> <title>标题</title> <![CDATA[ if(a<b&&b<c){ .... } ]]> </root>

命名空间

由于xml中标签是自定义的,多个xml文档同时使用可能出现标签名相同导致命名冲突的情况,此时需要使用命名空间来解决标签名冲突问题

<person> <name>周杰伦</name> <song>米兰的小铁匠</song> </person>
<person> <name>东野圭吾</name> <writing>解忧杂货店</writing> </person>

添加前缀

在标签名前添加前缀,来定义不同的标签,从而对不同文档的同名标签加以区分

<j:person> <j:name>周杰伦</j:name> <j:song>米兰的小铁匠</j:song> </j:person> <h:person> <h:name>东野圭吾</h:name> <h:writing>解忧杂货店</h:writing> </h:person>

添加XML Namespace(xmlns)属性

可以在父标签中添加命名空间属性,以此定义一个命名空间,之后带有相同前缀的子标签都将同属于该命名空间
xmlns:命名前缀=”namespaceURI”

<j:person xmlns:j="Jay Chou"> <j:name>周杰伦</j:name> <j:song>米兰的小铁匠</j:song> </j:person> <h:person xmlns:h="Higashino Keigo"> <h:name>东野圭吾</h:name> <h:writing>解忧杂货店</h:writing> </h:person>

使用默认的命名空间

当父元素定义默认的命名空间时,我们可以省略子元素中的前缀
xmlns=”namespaceURI”

<person xmlns="Jay Chou"> <name>周杰伦</name> <song>米兰的小铁匠</song> </person> <person xmlns="Higashino Keigo"> <name>东野圭吾</name> <writing>解忧杂货店</writing> </person>
URI指统一资源标识符(Uniform Resource Identifier),用于标识因特网资源,最常用的 URI 是用来标示因特网域名地址的统一资源定位器(URL),另一个不那么常用的 URI 是统一资源命名(URN),在使用命名空间时,很多xml文档会将名称写为一个链接形式,但该链接仅作为该命名空间的字符串名称,并不是要”链接”到某个地址,不会引入任何资源

DTD验证

DTD(Document Type Definition):文档类型定义,是一套为了进行程序间的数据交换而建立的关于标记符的语法规则

xml的标签是可以自由定义的,每个人写的xml将完全不同。但在一个团队内部,我们往往希望拥有一个统一的文件格式来进行数据交换。此时,我们可以使用DTD来对xml文件进行约束,使用一个标准的 DTD 来交换数据

使用IntelliJ IDEA写xml文件可以即时校验文档内容是否满足DTD验证

标签声明

限制标签内可以写入哪些内容

  • <!ELEMENT 标签名 (child1,child2…)> 标签中可以包含的子标签
    父标签中按顺序声明其中可以包含的子标签,子标签必须以相同的顺序出现在xml文档中,并且所有子标签也要声明其中可以写入的内容,子标签可以嵌套地拥有子标签
  • <!ELEMENT 标签名 (child1,(child2|child3)…)> 标签中可以包含的子标签并可选
  • <!ELEMENT 标签名 (#PCDATA)> 标签中仅包含需要解析的字符数据(可以为空)
  • <!ELEMENT 标签名 EMPTY> 声明为空标签
  • <!ELEMENT 标签名 ANY> 标签中可包含任何内容
  • <!ELEMENT 标签名 (#PCDATA|child1|child2|…)*> 标签中可包含PCDATA数据,也可以包含指定子标签必须添加*号
限制子标签的数量
  • <!ELEMENT 标签名 (child)> 子标签必须出现一次,且只能出现一次
  • <!ELEMENT 标签名 (child+)> 子元素至少出现一次
  • <!ELEMENT 标签名 (child*)> 子元素出现零次或多次
  • <!ELEMENT 标签名 (child?)> 子元素出现零次或一次
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web [ <!ELEMENT web (author,license,(body|content))> <!ELEMENT author (#PCDATA)> <!ELEMENT license (#PCDATA)> <!ELEMENT heading (#PCDATA|type)*> <!ELEMENT type (#PCDATA)> <!ELEMENT body (#PCDATA)> <!ELEMENT content (#PCDATA)> ]> <web> <author>SHIWIVI</author> <license>lol</license> <heading><type>Document</type></heading> <body>Meet you like the wind</body> </web> 1. !DOCTYPE web - 声明文档的根标签是web 2. !ELEMENT web - 声明web元素必须包含元素:author,license标签,body和content标签可二选一 3. !ELEMENT author - 声明author标签内容为 "#PCDATA"(其余语句同理) 4. !ELEMENT heading - 声明author标签内容为 "#PCDATA"或type标签,由于标签内容受限,需添加*号表示可出现零次或多次
声明实体

<!ENTITY 实体引用名称 “实体实际代表含义”> 定义一个实体
引用实体需要添加&;

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web [ <!ELEMENT web (author,license)> <!ELEMENT author (#PCDATA)> <!ELEMENT license (#PCDATA)> <!ENTITY sm "shiwivi.com">//实体声明 <!ENTITY license "License CC BY-NC 4.0"> ]> <web> <author>&sm;</author>//将解析为<author>shiwivi.com</author> <license>&license;</license> </web>

属性声明

限制标签可添加的属性以及属性值,语法格式为:
<!ATTLIST 标签名 属性名 属性类型 属性值>

属性类型 说明 属性类型 说明
CDATA 字符 NMTOKEN 该值是有效的XML名称
(v1|v2|..) 值只能为指定内容(枚举) NMTOKENS 该值是有效XML名称的列表
ID 值为唯一ID ENTITY 值是一个实体
IDREF 值是另一个元素的id ENTITIES 值是实体列表
IDREFS 该值是其他ID的列表 xml: 该值是预定义的xml值
属性值 说明 属性值 说明
字符串 属性默认值 #REQUIRED 属性是必需的
#IMPLIED 属性是可选的 #FIXED 值 属性值是固定的
1. 限制为test标签添加的属性只能为code,如果开发者不指定属性值,则默认值为java <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web [ <!ELEMENT web (test)> <!ELEMENT test EMPTY> <!ATTLIST test code "java">//属性声明 ]> <web> <test code="javaScript"/> </web> 2. 该标签必须添加code属性,并且不指定默认值 <!ATTLIST test code CDATA #REQUIRED> 3. 该标签不强制要求添加code属性,也不指定默认值 <!ATTLIST test code CDATA #IMPLIED> 4. 该标签强制拥有code属性并指定属性值为java,且不允许修改 <!ATTLIST test code CDATA #FIXED "java">

DTD文件引入

内部DTD

如果DTD被包含在xml文件中,需要被包装于DOCTYPE声明中
<!DOCTYPE 根标签 [标签声明内容]>

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web [ <!ELEMENT web (author,license)> <!ELEMENT author (#PCDATA)> <!ELEMENT license (#PCDATA)> ]> <web> ..... </web>
外部私有DTD

可以将DTD声明为一个外部文件,然后引用到xml文档中
<!DOCTYPE 根标签 SYSTEM “DTD的URL”>

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web SYSTEM "./check.dtd"> <web> .... </web>
<!--check.dtd文件--> <!ELEMENT web (author,license)> <!ELEMENT author (#PCDATA)> <!ELEMENT license (#PCDATA)>
外部公用DTD

也可以使用一些标准化组织或权威机构提供的DTD
<!DOCTYPE 根标签 PUBLIC “DTD公共名称” “DTD的URL”>

DTD公共名称格式为:“是(否)ISO注册//注册组织//DTD所描述的文件的信息//语言”

  • 是否由国际标准化组织(ISO)注册,+表示是,-表示不是
  • 注册组织或个人
  • 该DTD所验证文件的描述性信息,经常还会添加版本号
  • 语言标识,如:ZH为中文,EN为英文
    lt;!DOCTYPE web PUBLIC "-//shiwivi//blog config//CN" "http://www.shiwivi.com/blog/check.dtd">
上一篇:JavaScript中的各种尺寸
下一篇:SVG矢量图
z z z z z