xml 深入学习

Posted MartinDing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xml 深入学习相关的知识,希望对你有一定的参考价值。

 
专业术语
DTD document type defination 文档类型定义
PCDATA parsed character data 已解析字符数据
XSD xml shcema Defination XML模型定义
 
1.简介
xml 可扩展标记语言 Extensible Markup Language
XML的设计宗旨是传输数据,而非显示数据
1.xml传输数据 html 显示数据 设计的目的不一样
2. html 的标签固定 xml的标签不固定
  • xml的用处
1. 描述事物的树形结构
2.作为配置文件
3.解决数据传输不规范的情况
4. 是html 的补充 简化了数据传输,共享
5. 应用场景: HTML,WSDL,WAP,RSS,RDF,OWL,SML
xml 是纯文本
 
2.语法
分成文档声明,元素,属性,注释,CDATA区域,特殊字符,处理指令几块
 
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<?xml-stylesheet type="text/css" href="xml2.css" ?>
<!-- 上面是处理指令 -->
 
<books>
<!-- 根 -->
<!-- comments -->
<![CDATA[contents what ever]]>
<!-- CDATA 下面一段是错误代码区-->
<book attr=‘wow‘> <!-- 属性 这些注释是错误的 -->
<name>My life</name> <!-- 元素 这些注释是错误的-->
<price>100$</price>
</author><!-- 空标签 这些注释是错误的 空标签这种也不合格 我使用simplexml_load_file函数解析xml 的时候会出错-->
<author/> <!-- 这个才是正确的写法 -->
</book>
<book>
<name>Your Life</name>
<price>101$</price>
<author>Someone</author>
</book>
</books>
 
上面一部分错误的xml正确写法
<book attr=‘wow‘>
<name>My life</name>
<price>100$</price>
<author/>
</book>
 
1. 所有标签都有关闭标签 空标签简写 也必须是</author> 这样的
2.标签大小写敏感 <author>authorname</Author> 会发生错误
3.标签必须正确嵌套
4.必须有根标签
5.属性值加引号 单双都可以
6.标签里面的内容不能包含 <,>, & [ 三个都已经测试过不行,必须转义】
< &lt;
> &gt;
& &amp;
测试代码
$file = "/Users/dingmac/Desktop/demo.xml";
$string = file_get_contents($file);
$xml = simplexml_load_file($file);
var_dump($xml);
其中有个问题在解析元素的时候 在xml 中添加了注释<!-- 我是备注 -->
在解析的时候会出现 comments 元素 so 第7点上面的代码 元素部分
7. 所有注释不能放在元素名中间,也不能嵌套
8.元素内容中的空格 会保留 包括换行符
9.声明部分有几部分组成
version 版本号
encoding 编码
standalone yes|no 表示文档定义是否独立使用
10.标签命名规则
1.不能使用xml开始的名字
2.正常程序中使用的变量名字
3.不要使用- 使用_ 特殊符号 % & 等等别用 不要用: ,. 等 使用英语 中文也行 但是别扭不?
11.xml 是可以扩展的
12.属性通过 simplexml_load_file 函数解析之后 会出现下面的内容
["@attributes"]=>
array(1) {
["attr"]=>
string(3) "wow"
}
13.属性也能提供信息但是必须加引号,but 尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息 元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素
 
3.xml定义要遵循 DTD
DTD document type defination 文档类型定义
基本语法

#file myclass.dtd
<! ELEMENT 元素名 类型>
可以定义自己的DTD文件 文件名 myclass.dtd
<!ELEMENT class (student+)>
<!ELEMENT student (name,age,introduce)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT introduce (#PCDATA)>
 

#file demo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<!DOCTYPE class SYSTEM "myclass.dtd">
<!-- 使用规则 SYSTEM使用本地文件,public 使用网络文件 -->
<class>
<student>
<name>周小星</name>
<age>23</age>
<introduce>学习刻苦</introduce>
<score>99</score>
</student>
<student>
<name>林晓</name>
<age>25</age>
<introduce>是一个好学生</introduce>
<score>100</score>
</student>
</class>

引用 : Take a look at PHP‘s DOM, especially DOMDocument::schemaValidate and DOMDocument::validate.
 
#file xml_validate.php
 
<?php
$dom = new DOMDocument();
$dom->load("demo.xml");
if($dom->validate()){
echo "The DOM is validate";
}

DTD 语法
 
1. 文件位置
本地文件
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
网络文件
<!DOCTYPE 根元素 PUBLIC "DTD 名称" "DTD url">
比如
 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
2.基本语法 <!ELEMENT 元素 内容>
- ELEMENT是关键字,是不能修改的 
- NAME表示元素名称 
- CONTENT是元素类型,必须要大写!CONTENT的内容有三种写法:
(1)EMPTY——表示该元素不能包含子元素和文本,但可以有属性。 
(2)ANY——表示该元素可以包含任何在该DTD中定义的元素内容 
(3)#PCDATA——可以包含任何字符数据,但是不能在其中包含任何子元素
EMPTY < #PCDATA <ANY
另外一点需要注意的是 元素 内容之间一定要有空格 包括下面提到的第三点
 
3.元素的组合类型
<!ELEMENT 元素 类型>
demo:
<!ELEMENT class (student+)> 注意这边的空格是一定要的
 
符号 用途 示例 示例说明
() 用来给元素分组 (古龙|金庸),(王朔|余杰) 分成两组
| 在列出的对象中选择一个 (男人|女人) 表示男人或者女人必须出现,两者至少选其一
+ 该对象必须出现一次或者多次 (成员+) 表示成员必须出现,而却可以出现多个成员
* 该对象允许出现0次或者多次 (爱好*) 爱好可以出现两次到多次
? 该对象必须出现0次或者1次 (菜鸟?) 菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次
, 对象必须按指定的顺序出现 (西瓜,苹果,香蕉) 表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现
 
4.定义属性
 
<!ATTLIST 元素
属性名称 类型 属性的特点
属性名称 类型 属性的特点
...
>
 
属性的类型有
1. CDATA 字符数据 任何字符
<!ATTLIST student
address CDATA #REQUIRED
>
2.ID 唯一的字符串 不能以数字开头
<!ATTLIST student
no ID #REQUIRED
>
3.IDREF/IDREFS - IDREF属性的值指向文档中其它地方声明的ID类型的值 - IDREFS同IDREF,但是可以具有由空格分开的多个引用。
<!ATTLIST student
relID ID #REQUIRED
parentID IDREFS #IMPLIED
name CDATA #REQUIRED
>
4.Enumerated 属性类型-Enumerated,事先定义好一些值,属性的值必须在所列出的值的范围内。
<!ATTLIST student
marriage (sigle|married|devorced|widowed) #IMPLIED
>
5.ENTITY/ENTITIES
我测试下来如果要使用 ENTITY 就必须使用 内嵌的DTD 方式
 
<!DOCTYPE 节点名称 [
<!ENTITY copyright "this is copyright">
<!ELEMENT student (name,age,instroduce)>
]>
 
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
- 在DTD定义中,一条!ENTITY语句用于定义一个实体。
- 实体可分为两种类型:引用实体和参数实体。引用实体是被XML文档应用的,而参数实体是被DTD文件本身应用的。
 
1.引用实体:
 
引用实体主要在XML文档中被应用
语法格式如下,引用实体的定义内容最好放在DTD文件的最后。
 
<!ENTITY 实体名称 "实体内容">
引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容
demo
#我测试下来在dtd 文件中定义没有用只能在xml里面定义才有用
 
<!DOCTYPE class SYSTEM "myclass.dtd"> // 这样在myclass.dtd 文件中定义没有用
只能在xml 文件中定义
<!DOCTYPE class [
<!ENTITY copyright "I am a Copyright">
]>
<copyright> &copyright</copyright>
 
在xml 里面直接使用 &copyright 可以直接调用 I am a Copyright
 
引用 外面文件
<!ENTITY chapter.1 SYSTEM "chapter1.xml"> // 本地文件
 
调用的时候 &chapter.1;
 
2.参数实体 被DTD文件本身应用的
<!ENTITY % 实体名称 "实体内容">
应用方式
% 实体名称; 记得分好 这个可以在DTD 文件中定义
 
demo
dtd 文件
#myclass.dtd
 
<!ELEMENT class (student+)>
<!ENTITY js "Jo Smith">
<!ENTITY % TAG_NAME "name|age|introduce">
<!ATTLIST student
address CDATA #IMPLIED
>
<!ELEMENT student (%TAG_NAME;|生日)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT introduce (#PCDATA)>
<!ELEMENT 生日 (#PCDATA)>
 
xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<!DOCTYPE class SYSTEM "myclass.dtd">
<class>
<student address="HONGKONG">
<name>周小星</name>
<age>23</age>
<introduce>学习刻苦</introduce>
</student>
<student address="Shanghai">
<name>林晓</name>
<age>25</age>
<introduce>是一个好学生 </introduce>
</student>
</class>
 
验证的时候将会有如下提示
 
Warning: DOMDocument::validate(): Element student content does not follow the DTD, expecting (name | age | introduce | 生日), got (name age introduce ) in /Users/dingmac/Desktop/xml_validator.php on line 5
说明生效了
 
 
 
属性的特点有
#REQUIED 表示这个属性必须给,不给就报错
#IMPLIED 表示这个属性可以给也可以不给
#FIXED value 表示这个属性必须给一个固定的value值
Default value 表示这个属性如果没有值,就分配一个默认的value值
demo <!ATTLIST name id CDATA "0">
 
修改上面的myclass.dtd 文件
 
<!ELEMENT class (student+)>
<!ENTITY js "Jo Smith">
<!ENTITY % TAG_NAME "name|age|introduce">
<!ATTLIST student
address CDATA #IMPLIED
>
<!ELEMENT student (%TAG_NAME;|birthday)+ >
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT introduce (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
 
xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<!DOCTYPE class SYSTEM "myclass.dtd">
<class>
<student address="HONGKONG">
<name>周小星</name>
</student>
<student address="Shanghai">
<name>林晓</name>
<age>25</age>
<introduce>是一个好学生 </introduce>
<birthday></birthday>
</student>
</class>
 
是ok的
 
最后看到了一个蛮好的解决方案
又是文本引用 也包含我们想要的 ENTITY 引用
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<!DOCTYPE class SYSTEM "myclass.dtd" [ <!ENTITY name "xiaomug"> ]>
<class>
<student address="HONGKONG">
<name>周小星</name>
</student>
<student address="Shanghai">
<name>林晓</name>
<age>25</age>
<introduce>是一个好学生 </introduce>
<birthday>&name;</birthday>
</student>
</class>
 
扩展阅读
Using Entities to Include Files XML Primer
ATTLIST Declaration
教程
https://www.tutorialspoint.com/dtd/dtd_attributes.htm 如果本文没有使你明白 请首先参考这个链接的教程
 
参考
 
 

 
4. XML Schema(图解,模式)
 
1. XML Schema Defination 简写 XSD 是 DTD Document Type Defination 的替代品 支持namespace
 
优点:
  • XML Schema 可针对未来的需求进行扩展
  • XML Schema 更完善,功能更强大
  • XML Schema 基于 XML 编写
  • XML Schema 支持数据类型
  • XML Schema 支持命名空间
 
通过对数据类型的支持:
  • 可更容易地描述允许的文档内容
  • 可更容易地验证数据的正确性
  • 可更容易地与来自数据库的数据一并工作
  • 可更容易地定义数据约束(data facets)
  • 可更容易地定义数据模型(或称数据格式)
  • 可更容易地在不同的数据类型间转换数据
 
<! [CDATA [文本内容]] > 在特殊的标签CDATA下,所有的标签、实体引用都被忽略,而被XML处理程
序一视同仁地当作字符数据看待。
 
2. 处理指令 (PI process Instruction)处理指令用来指挥解析引擎如何解析XML文档内容
处理指令必须以“<?”作为开头,以“?>”作为结尾 【看到了了没 和php的简写标签是一样的】
 
例如,在XML文档
中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容
 
3.对xsd 文件的引用
<?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>
 
对 DTD 的引用
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3school.com.cn note.dtd"> <note>
<to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don‘t forget the meeting!</body> </note>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
专业术语
DTD document type defination 文档类型定义
PCDATA parsed character data 已解析字符数据
XSD xml shcema Defination XML模型定义
 
1.简介
xml 可扩展标记语言 Extensible Markup Language
XML的设计宗旨是传输数据,而非显示数据
  • 和html 的差异
1.xml传输数据 html 显示数据 设计的目的不一样
2. html 的标签固定 xml的标签不固定
  • xml的用处
1. 描述事物的树形结构
2.作为配置文件
3.解决数据传输不规范的情况
4. 是html 的补充 简化了数据传输,共享
5. 应用场景: HTML,WSDL,WAP,RSS,RDF,OWL,SML
xml 是纯文本
 
2.语法
分成文档声明,元素,属性,注释,CDATA区域,特殊字符,处理指令几块
 
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<?xml-stylesheet type="text/css" href="xml2.css" ?>
<!-- 上面是处理指令 -->
 
<books>
<!-- 根 -->
<!-- comments -->
<![CDATA[contents what ever]]>
<!-- CDATA 下面一段是错误代码区-->
<book attr=‘wow‘> <!-- 属性 这些注释是错误的 -->
<name>My life</name> <!-- 元素 这些注释是错误的-->
<price>100$</price>
</author><!-- 空标签 这些注释是错误的 空标签这种也不合格 我使用simplexml_load_file函数解析xml 的时候会出错-->
<author/> <!-- 这个才是正确的写法 -->
</book>
<book>
<name>Your Life</name>
<price>101$</price>
<author>Someone</author>
</book>
</books>
 
上面一部分错误的xml正确写法
<book attr=‘wow‘>
<name>My life</name>
<price>100$</price>
<author/>
</book>
 
1. 所有标签都有关闭标签 空标签简写 也必须是</author> 这样的
2.标签大小写敏感 <author>authorname</Author> 会发生错误
3.标签必须正确嵌套
4.必须有根标签
5.属性值加引号 单双都可以
6.标签里面的内容不能包含 <,>, & [ 三个都已经测试过不行,必须转义】
< &lt;
> &gt;
& &amp;
测试代码
$file = "/Users/dingmac/Desktop/demo.xml";
$string = file_get_contents($file);
$xml = simplexml_load_file($file);
var_dump($xml);
其中有个问题在解析元素的时候 在xml 中添加了注释<!-- 我是备注 -->
在解析的时候会出现 comments 元素 so 第7点上面的代码 元素部分
7. 所有注释不能放在元素名中间,也不能嵌套
8.元素内容中的空格 会保留 包括换行符
9.声明部分有几部分组成
version 版本号
encoding 编码
standalone yes|no 表示文档定义是否独立使用
10.标签命名规则
1.不能使用xml开始的名字
2.正常程序中使用的变量名字
3.不要使用- 使用_ 特殊符号 % & 等等别用 不要用: ,. 等 使用英语 中文也行 但是别扭不?
11.xml 是可以扩展的
12.属性通过 simplexml_load_file 函数解析之后 会出现下面的内容
["@attributes"]=>
array(1) {
["attr"]=>
string(3) "wow"
}
13.属性也能提供信息但是必须加引号,but 尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息 元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素
 
3.xml定义要遵循 DTD
DTD document type defination 文档类型定义
基本语法

#file myclass.dtd
<! ELEMENT 元素名 类型>
可以定义自己的DTD文件 文件名 myclass.dtd
<!ELEMENT class (student+)>
<!ELEMENT student (name,age,introduce)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT introduce (#PCDATA)>
 

#file demo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<!DOCTYPE class SYSTEM "myclass.dtd">
<!-- 使用规则 SYSTEM使用本地文件,public 使用网络文件 -->
<class>
<student>
<name>周小星</name>
<age>23</age>
<introduce>学习刻苦</introduce>
<score>99</score>
</student>
<student>
<name>林晓</name>
<age>25</age>
<introduce>是一个好学生</introduce>
<score>100</score>
</student>
</class>

引用 : Take a look at PHP‘s DOM, especially DOMDocument::schemaValidate and DOMDocument::validate.
 
#file xml_validate.php
 
<?php
$dom = new DOMDocument();
$dom->load("demo.xml");
if($dom->validate()){
echo "The DOM is validate";
}

DTD 语法
 
1. 文件位置
本地文件
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
网络文件
<!DOCTYPE 根元素 PUBLIC "DTD 名称" "DTD url">
比如
 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
2.基本语法 <!ELEMENT 元素 内容>
- ELEMENT是关键字,是不能修改的 
- NAME表示元素名称 
- CONTENT是元素类型,必须要大写!CONTENT的内容有三种写法:
(1)EMPTY——表示该元素不能包含子元素和文本,但可以有属性。 
(2)ANY——表示该元素可以包含任何在该DTD中定义的元素内容 
(3)#PCDATA——可以包含任何字符数据,但是不能在其中包含任何子元素
EMPTY < #PCDATA <ANY
另外一点需要注意的是 元素 内容之间一定要有空格 包括下面提到的第三点
 
3.元素的组合类型
<!ELEMENT 元素 类型>
demo:
<!ELEMENT class (student+)> 注意这边的空格是一定要的
 
符号 用途 示例 示例说明
() 用来给元素分组 (古龙|金庸),(王朔|余杰) 分成两组
| 在列出的对象中选择一个 (男人|女人) 表示男人或者女人必须出现,两者至少选其一
+ 该对象必须出现一次或者多次 (成员+) 表示成员必须出现,而却可以出现多个成员
* 该对象允许出现0次或者多次 (爱好*) 爱好可以出现两次到多次
? 该对象必须出现0次或者1次 (菜鸟?) 菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次
, 对象必须按指定的顺序出现 (西瓜,苹果,香蕉) 表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现
 
4.定义属性
 
<!ATTLIST 元素
属性名称 类型 属性的特点
属性名称 类型 属性的特点
...
>
 
属性的类型有
1. CDATA 字符数据 任何字符
<!ATTLIST student
address CDATA #REQUIRED
>
2.ID 唯一的字符串 不能以数字开头
<!ATTLIST student
no ID #REQUIRED
>
3.IDREF/IDREFS - IDREF属性的值指向文档中其它地方声明的ID类型的值 - IDREFS同IDREF,但是可以具有由空格分开的多个引用。
<!ATTLIST student
relID ID #REQUIRED
parentID IDREFS #IMPLIED
name CDATA #REQUIRED
>
4.Enumerated 属性类型-Enumerated,事先定义好一些值,属性的值必须在所列出的值的范围内。
<!ATTLIST student
marriage (sigle|married|devorced|widowed) #IMPLIED
>
5.ENTITY/ENTITIES
我测试下来如果要使用 ENTITY 就必须使用 内嵌的DTD 方式
 
<!DOCTYPE 节点名称 [
<!ENTITY copyright "this is copyright">
<!ELEMENT student (name,age,instroduce)>
]>
 
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
- 在DTD定义中,一条!ENTITY语句用于定义一个实体。
- 实体可分为两种类型:引用实体和参数实体。引用实体是被XML文档应用的,而参数实体是被DTD文件本身应用的。
 
1.引用实体:
 
引用实体主要在XML文档中被应用
语法格式如下,引用实体的定义内容最好放在DTD文件的最后。
 
<!ENTITY 实体名称 "实体内容">
引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容
demo
#我测试下来在dtd 文件中定义没有用只能在xml里面定义才有用
 
<!DOCTYPE class SYSTEM "myclass.dtd"> // 这样在myclass.dtd 文件中定义没有用
只能在xml 文件中定义
<!DOCTYPE class [
<!ENTITY copyright "I am a Copyright">
]>
<copyright> &copyright</copyright>
 
在xml 里面直接使用 &copyright 可以直接调用 I am a Copyright
 
引用 外面文件
<!ENTITY chapter.1 SYSTEM "chapter1.xml"> // 本地文件
 
调用的时候 &chapter.1;
 
2.参数实体 被DTD文件本身应用的
<!ENTITY % 实体名称 "实体内容">
应用方式
% 实体名称; 记得分好 这个可以在DTD 文件中定义
 
demo
dtd 文件
#myclass.dtd
 
<!ELEMENT class (student+)>
<!ENTITY js "Jo Smith">
<!ENTITY % TAG_NAME "name|age|introduce">
<!ATTLIST student
address CDATA #IMPLIED
>
<!ELEMENT student (%TAG_NAME;|生日)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT introduce (#PCDATA)>
<!ELEMENT 生日 (#PCDATA)>
 
xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<!DOCTYPE class SYSTEM "myclass.dtd">
<class>
<student address="HONGKONG">
<name>周小星</name>
<age>23</age>
<introduce>学习刻苦</introduce>
</student>
<student address="Shanghai">
<name>林晓</name>
<age>25</age>
<introduce>是一个好学生 </introduce>
</student>
</class>
 
验证的时候将会有如下提示
 
Warning: DOMDocument::validate(): Element student content does not follow the DTD, expecting (name | age | introduce | 生日), got (name age introduce ) in /Users/dingmac/Desktop/xml_validator.php on line 5
说明生效了
 
 
 
属性的特点有
#REQUIED 表示这个属性必须给,不给就报错
#IMPLIED 表示这个属性可以给也可以不给
#FIXED value 表示这个属性必须给一个固定的value值
Default value 表示这个属性如果没有值,就分配一个默认的value值
demo <!ATTLIST name id CDATA "0">
 
修改上面的myclass.dtd 文件
 
<!ELEMENT class (student+)>
<!ENTITY js "Jo Smith">
<!ENTITY % TAG_NAME "name|age|introduce">
<!ATTLIST student
address CDATA #IMPLIED
>
<!ELEMENT student (%TAG_NAME;|birthday)+ >
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT introduce (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
 
xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<!DOCTYPE class SYSTEM "myclass.dtd">
<class>
<student address="HONGKONG">
<name>周小星</name>
</student>
<student address="Shanghai">
<name>林晓</name>
<age>25</age>
<introduce>是一个好学生 </introduce>
<birthday></birthday>
</student>
</class>
 
是ok的
 
最后看到了一个蛮好的解决方案
又是文本引用 也包含我们想要的 ENTITY 引用
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面是声明 -->
<!DOCTYPE class SYSTEM "myclass.dtd" [ <!ENTITY name "xiaomug"> ]>
<class>
<student address="HONGKONG">
<name>周小星</name>
</student>
<student address="Shanghai">
<name>林晓</name>
<age>25</age>
<introduce>是一个好学生 </introduce>
<birthday>&name;</birthday>
</student>
</class>
 
扩展阅读
Using Entities to Include Files XML Primer
ATTLIST Declaration
教程
https://www.tutorialspoint.com/dtd/dtd_attributes.htm 如果本文没有使你明白 请首先参考这个链接的教程
 
参考
 
 

 
4. XML Schema(图解,模式)
 
这一部分正在看 之后补全
 
1. XML Schema Defination 简写 XSD 是 DTD Document Type Defination 的替代品 支持namespace
 
优点:
  • XML Schema 可针对未来的需求进行扩展
  • XML Schema 更完善,功能更强大
  • XML Schema 基于 XML 编写
  • XML Schema 支持数据类型
  • XML Schema 支持命名空间
 
通过对数据类型的支持:
  • 可更容易地描述允许的文档内容
  • 可更容易地验证数据的正确性
  • 可更容易地与来自数据库的数据一并工作
  • 可更容易地定义数据约束(data facets)
  • 可更容易地定义数据模型(或称数据格式)
  • 可更容易地在不同的数据类型间转换数据
 
<! [CDATA [文本内容]] > 在特殊的标签CDATA下,所有的标签、实体引用都被忽略,而被XML处理程
序一视同仁地当作字符数据看待。
 
2. 处理指令 (PI process Instruction)处理指令用来指挥解析引擎如何解析XML文档内容
处理指令必须以“<?”作为开头,以“?>”作为结尾 【看到了了没 和php的简写标签是一样的】
 
例如,在XML文档
中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容
 
3.对xsd 文件的引用
<?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>
 
对 DTD 的引用
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3school.com.cn note.dtd"> <note>
<to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don‘t forget the meeting!</body> </note>
  
 

以上是关于xml 深入学习的主要内容,如果未能解决你的问题,请参考以下文章

深入学习PHP中的JSON相关函数

Maven学习总结(19)——深入理解Maven相关配置

mybatis学习—— mybatis 的参数深入 输出结果封装 SqlMapConfig.xml配置文件

mybatis学习—— mybatis 的参数深入 输出结果封装 SqlMapConfig.xml配置文件

NLog学习笔记二:深入学习

深入学习Ajax