XML学习
- 什么是XML?
- XML指可扩展标记语言(Extensible Markup Language)。
- XML是一种很像HTML的标记语言。
- XML的设计宗旨是传输数据,而不是显示数据。
- XML标签没有被预定义。您需要自行定义标签。
- XML被设计为具有自我描述性。
- XML是W3C的推荐标准。
- XML和HTML之间的差异
XML不是HTML的替换。XML和HTML为不同的目的而设计,HTML宗旨在于显示信息,而XML是在传输信息。
- XML被设计用来传输和存储数据,其焦点是数据的内容。
- HTML被设计用来显示数据,其焦点是数据的外观。
-
XML声明
<?xml version="1.0" encoding="UTF-8"?>
-
文档实例
<?xml version="1.0" encoding="UTF-8">
<site>
<name>BAIDU</name>
<url>https://www.baidu.com</url>
<desc>百度一下</desc>
</site>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</proce>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>Makding</author>
<year>2005</year>
<price>29.8</price>
<book>
<bookstore>
注意:
- XML必须包含根元素,它是所有其他元素的父元素
- XML声明文件的可选部分,如果存在需要放在文档的第一行。
- 所有的XML元素都必须有一个关闭标签
- XML标签的大小写敏感
- XML必须使用正确的嵌套
- XML属性值必须加引号
- 在XML中,一些字符拥有特殊意义,为了避免错误,请使用实体引用来替换
- 在XML中,空格会被保留
在XML中,有5个预定义的实体引用:
引用 | 实体 | 意思 |
---|---|---|
< | < | less than |
> | > | greater than |
& | & | ampersand |
' | ' | apostrophe |
" | " | quotation mark |
在XML中编写注释的语法与HTML的语法很相似。
<!--This is a comment -->
XML命名规则:
- 名称可以包含字母、数字以及其他字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母xml(或者XML、Xml等等)开始
- 名称不能包含空格
避免使用XML属性
- 属性不能包含多个值(元素可以)
- 属性不能包含数结构(元素可以)
- 属性不容易扩展(为未来的变化)
DTD(文档类型定义)的作用是定义XML文档的合法构建模块。DTD可被成行地声明于XML文档中,也可以作为一个外部引用。
- 内部的DOCTYPR声明
假如DTD被包含在你的XML源文件中,它应当通过下面的语法包装在一个DOCTYPE声明中:
<!DOCTYPE root-element [element-declarations]>
带有DTD的XML文档实例
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
浏览器打开查看:
以上DTD解释如下:
- !DOCTYPE note(第二行)定义此文档是note类型的文档。
- !ELEMENT note(第三行)定义note元素有四个元素:“to、from、heading、body”
- !ELEMENT to(第四行)定义to元素为“#PCDATA"类型
- !ELEMENT to(第四行)定义from元素为“#PCDATA"类型
- !ELEMENT to(第四行)定义heading元素为“#PCDATA"类型
- !ELEMENT to(第四行)定义body元素为“#PCDATA"类型
- 外部文档声明
假如DTD位于XML源文件的外部,那么它应该通过下面的语法被封装在一个DOCTYPE定义中:
<!DOCTYPE root-element SYSTEM "filename">
这个XML文档和上面的XML文档相同,但是拥有一个外部的DTD:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
包含DTD的"note.dtd"文件
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
- 为什么使用DTD?
通过DTD,你的每一个XML文件均可携带一个有关于自身格式的描述。通过DTD,独立的团体可一致地使用某个标准的DTD来交换数据。你的应用程序也可使用某个标准DTD来验证从外部接收到的数据。还可以使用DTD来验证你自身的数据。
XML构建模块
XML和HTML文档的主要的构建模块是元素的标签。
所有的XML文档(以及HTML文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA
- CDATA
PCDATA的意思是被解析的字符数据(parsed character data),可把字符数据想象为XML元素的开始标签与结束标签之间的文本。PCDATA是会被解析器解析的文本,这些文本将被解析器检查实体以及标记。
CDATA的意思的是字符数据(character data),CDATA是不会被解析器解析文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
DTD元素
在一个DTD中,元素通过元素声明来进行声明。
在DTD中,XML元素通过元素声明来进行声明。元素声明使用以下语法:
<!ELEMENT element-name category>
或
<!ELEMENT element-name (element-content)>
空元素可以通过类别关键词EMPTY进行声明:
<!ELEMENT element-name EMPTY>
实例
<!ELEMENT br EMPTY>
XML example:
<br />
只有PCDATA的元素:
<!ELEMENT element-name (#PCDATA)>
实例:
<!ELEMENT from (#PCDATA)>
带有任何内容的元素
通过类别词ANY声明的元素,可包含任何可解析的数据的组合:
<!ELEMENT element-name ANY>
实例:
<!ELEMENT note ANY>
带有子元素(序列)的元素
带有一个或者多个子元素通过圆括号中的子元素名进行声明:
<!ELEMENT element-name (child1)>
或者
<!ELEMENT elemant-name (child1,child3,...)>
实例
<!ElEMENT note (to,from,heading,body)>
当子元素按照有逗号分隔的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中,在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note"元素的完整声明是:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
声明只出现一次的元素
<!ELEMENT element-name (child-name)>
实例
<!ELEMENT note (message)>
声明最少出现一次的元素
<!ELEMENT element-name (child-name+)>
实例
<!ELEMENT note (message+)>
声明出现零次或者多次的元素
<!ELEMENT element-name (child-name*)>
实例
<!ELEMENT note (message*)>
声明"非../即..."类型的内容
<!ELEMENT note ( to,from,header,(message|body))>
声明混合型的内容
<!ELEMENT note (#PCDATA|to|from|header|message)*>
DTD属性
声明属性
<!ATTLIST element-name attribute-name attribute-type attribute-value>
DTD实例:
<!ATTLIST payment type CDATA "check">
XML实例:
<payment type="check"/>
属性类型选项:
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1 | en2 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml: | 值是一个预定义的 XML 值 |
XML DOM(XML Document Object Model)定义了访问和操作XML文档的标准方法。XML DOM把XML文档作为树结构来查看,所有元素可以通过DOM树来访问,可以修改或者删除它们的内容,并创建新的元素。
XML HttpRequest对象用于在后台与服务器交换数据。
XML 命名空间通过避免元素命名冲突的方法
- 使用前缀来避免命名冲突
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
在上面的实例中,不会有冲突,因为两个
元素有不同的名称。XML命名空间-xmlns属性
当在XML中使用前缀时,一个所谓的前缀的命名空间必须被定义。命名空间时在元素开始标签的xmlns属性中定义的,命名空间上面的语法如下。xmlns:前缀="URI".
<root>
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
在上面
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3cschool.cc/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
注意:命名空间URL不会被解析器用于查找信息。其目的是赋予命名空间一个唯一的名称。不过,很多公司常常会作为指针来使命名空间指向实际的网页,这个网页包含关于命名空间的信息。
XSLT是一种用于把XML文档转换为其他格式的XML语言。
XML文档中的所有文本均会被解析器解析,只有CDATA区段中的文本会被解析器忽略。
PCDATA-被解析的字符数据,当某个XML元素被解析时,其标签之间的文本也会被解析,之所以会只有做,是因为XML元素可能包含其他元素,例如下面实例:
<name><first>Bill</first><last>Gates</last></name>
CDATA是不应该由XML解析器解析的文本数据:CDATA部分由:<![CDATA["开始,由"]]>结束;