xml 深入学习

 
专业术语
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>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
专业术语
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>
  
 
慢慢沉淀自己
原文地址:https://www.cnblogs.com/martinding/p/7471098.html