前言:
XML指可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据。我们在jQuery中讲解了现在流行了JSON,但是为了更好的学习之后的框架,我们还是来看看XML教程。
首先,我们依旧从一个简单的例子开始:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heding>Reminder</heding>
<body>Don't forget me this weekend!</boy>
</note>
1、什么是XML?
1)XML指可扩展标记语言
2)XML是一种很像HTML的标记语言
3)XML的设计宗旨是传输数据,而不是显示数据。
4)XML标签没有被预定义,你需要自行定义标签
5)XML被设计为具有自我描述性
6)XML是W3C的推荐标准。
那我们很快就可以看出,XML的焦点是数据的内容,HTML的焦点是数据的外观。
2、XML用途
1)XML把数据从HTML分离
如果您需要在HTML文档中显示动态数据,每当数据改变时,需要花费大量时间来编辑HTML,通过XML,数据可以独立存储在XML文件中(当然啦,我们肯定是可以通过JavaScript来改变的)。所以通过使用几行JavaScript代码,就可以读取到一个外部XML文件,并更新网页的数据内容。
3、XML树结构
我们上面的例子中,第一行是XML声明,定义版本和使用的编码,之后就是根元素和子元素。我们很清楚HTML中DOM的树结构,那么我们看看XML文档的树结构吧。
4、语法
1)文档必须有根元素
2)XML声明文件时可选的,如果需要要放到文档的第一行
3)每一个元素都必须有一个关闭标签
4)标签对大小写敏感。
5)属性值必须加引号
6)当然,这里也有实体引用
< | < | less than |
---|---|---|
> | > | greater than |
& | & | ampersand |
' | ' | apostrophe |
" | " | quotation mark |
7)注释,和HTML一样<!-- comment -->
8)在HML中,空格会被保留
9)XML以LF存储换行
在Windows应用程序中,换行通常用一对字符来存储:回车符(CR)和换行符(LF)
在Unix和Mac OSX中,使用LF来存储新行。
在旧的Mac系统中,使用CR来存储新行。
XML以LF存储换行(我们用'\n'就好~)。
5、XML元素
XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
一个元素可以包括:
-
其他元素
-
文本
-
属性
-
或混合以上所有...
1)命名规则
虽然大多和编程语言命名规则一致,但有所差别:
-
名称可以包含字母、数字以及其他的字符
-
名称不能以数字或者标点符号开始
-
名称不能以字母 xml(或者 XML、Xml 等等)开始
-
名称不能包含空格
好的命名就是具有描述性,用下换线之类的,避免使用奇怪的字符。
6、XML属性
虽然是自定义标签,但是也有属性:
第一个实例中使用了 date 属性:
<note date="10/01/2008">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第二个实例中使用了date元素:
<note>
<date>10/01/2008</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
第三个实例中使用了扩展的date元素:
<note>
<date>
<day>10</day>
<month>01</month>
<year>2008</year>
</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
1)我们要注意属性不能包含多个值(元素可以);属性不能包含树结构;属性不容易扩展。
2)针对元数据的XML属性:
这里分配ID引用,仅仅是为了标识XML元素:
<messages>
<note id="501">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note id="502">
<to>Jani</to>
<from>Tove</from>
<heading>Re: Reminder</heading>
<body>I will not</body>
</note>
</messages>
7、验证
拥有正确语法的XML被称为“形式良好”的XML,通过DTD验证的XML是合法的XML。
1)验证XML文档
DOCTYPE声明是对外部DTD文件的引用
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
这个文件的内容如下:
<!DOCTYPE note
[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
2)也可以使用XML Schema代替DTD。
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
3)验证器
可以用一个通过的XML验证器
验证部分扩展-简洁DTD教程
DTD(文档类型定义)的作用是定义XML文档的合法合并模块,可以成行的声明与XML文档中,也可以作为一个外部引用。
1、简介
1)内部DOCTYPE声明
加入DTD被包含在你的XML源文件中,它正确通过下面的语法包装在一个DOCTYPE声明中:
<!DOCTYPE root-element [element-declarations]>
例如:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!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>
-
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
-
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
-
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
-
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
-
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
-
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型
2)外部文档声明
<!DOCTYPE root-element SYSTEM "filename">
<?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,你的每一个XML文件均可携带一个有相关自身格式的描述,可以一致的使用某个DTD来交换数据,也可以验证自身的数据。
2、DTD-XML构建模块
1、XML文档构造模块:
-
元素
-
属性
-
实体
-
PCDATA
-
CDATA
这里我们解释PCDATA:
PCDATA的意思是被解析的字符数据(parsed character data)。可以把字符数据想象为XML元素的开始标签与结束标签之间的文本,PCDATA是被解析器解析的文本,这些文本将被解析器检查实体以及标记。
CDATA:
CDATA的意思是字符数据(character data),CDATA是不会被解析器解析的文本。
3、元素
1)声明一个元素:
在一个DTD中,元素通过元素声明来进行声明:
<!ELEMENT element-name category>
或
<!ELEMENT element-name (element-content)>
4、属性
在DTD中,属性通过ATTLIST声明来进行声明
<!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 值 |
7、使用XSLT显示XML
为了更加直观的看到我们的XML,我们可以使用CSS,但是不推荐使用这个,所以我们使用XSLT。它是首选的XML样式表语言,比CSS更加完善,是在浏览器显示XML文件之前,先把它转换为HTML。
8、JavaScript-XMLHttpRequest对象
XMLHttpRequest对象用于在后台与服务器交换数据,是开发者的梦想,因为能够:
-
在不重新加载页面的情况下更新网页
-
在页面已加载后从服务器请求数据
-
在页面已加载后从服务器接收数据
-
在后台向服务器发送数据
创建一个XMLHttpRequest对象语法:
xmlhttp=new XMLHttpRequest();
9、XML Parser
我们在学习JSON的时候,有parse()方法解析,这里我们看看XML的解析。
1)解析XML文档:
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","books.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
2)解析XML字符串
txt="<bookstore><book>";
txt=txt+"<title>Everyday Italian</title>";
txt=txt+"<author>Giada De Laurentiis</author>";
txt=txt+"<year>2005</year>";
txt=txt+"</book></bookstore>";
if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(txt);
}
我们把XML转换为了XML DOM对象。
3)XML DOM
这里将XML文档解析到XMLDOM对象中,然后通过JavaScript提取信息:
<html>
<body>
<h1>W3Schools Internal Note</h1>
<div>
<b>To:</b> <span id="to"></span><br />
<b>From:</b> <span id="from"></span><br />
<b>Message:</b> <span id="message"></span>
</div>
<script>
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","note.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
document.getElementById("to").innerHTML=
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
document.getElementById("from").innerHTML=
xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
document.getElementById("message").innerHTML=
xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;
</script>
</body>
</html>
10、服务器上的XML
1)从数据库生成XML
<%
response.ContentType = "text/xml"
set conn=Server.CreateObject("ADODB.Connection")
conn.provider="Microsoft.Jet.OLEDB.4.0;"
conn.open server.mappath("/db/database.mdb")
sql="select fname,lname from tblGuestBook"
set rs=Conn.Execute(sql)
response.write("<?xml version='1.0' encoding='ISO-8859-1'?>")
response.write("<guestbook>")
while (not rs.EOF)
response.write("<guest>")
response.write("<fname>" & rs("fname") & "</fname>")
response.write("<lname>" & rs("lname") & "</lname>")
response.write("</guest>")
rs.MoveNext()
wend
rs.close()
conn.close()
response.write("</guestbook>")
%>
后记:
去了解XML可以很好的帮助我们之后去理解javaweb中xml文件结构。