九月星空

已埋半截……

XML高级部分

杂烩 0 评

1.XML的命名空间

XML中不同文档中的元素重名是不可以避免的,除了在元素名加前缀解决外,还可以使用XML的命名空间.
命名空间属性一般放在元素标记的开始处
如 <funame xmlns="http://www.w3.org/furniture">

用来标识命名空间的网络地址并不被XML解析器调用,XML解析器不需要从这个网络地址中查找信息,该网络地址的作用仅仅是给命名空间一个唯一的名字,因此这个网络地址也可以是虚拟的,然而又很多公司经常把这个网络地址值象一个真实的Web页面,这个地址包含了关于当前命名空间更详细的信息。

2.XML的CDATA

应用最广泛的就数CDATA了.
在XML文档中的所有文本都会被解析器解析,只有在CDATA部件之内的文本会被解析器忽略.

此外有必要说一下转义字符部分,如果文本中使用到XML标记中需要的字符应更改为其实体,不然XML会解析出错.
一共5个转义字符实体
<   <   小于号
>   >   大于号
&   &   和
&apos;   '   单引号
"   "   双引号

如果文本中包含很多需要转义的字符,比如程序代码.那么把它们放到CDATA中是最好的选择了.
一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束.

需要注意的是:CDATA部件之间不能再包含CDATA部件(不能嵌套).如果CDATA部件包含了字符"]]>" 或者"<![CDATA[" ,那么解析将会出错.
应当尽量避免.

3.XML编码

为了让解析器能够明白XML中的外文字符,必须在XML文档中统一的字符编码标准.
使用方法是在XML文档声明中加入一个encoding属性.
如 <?xml version="1.0" encoding="gb2312"?>
正确显示中文的编码类型为"gb2312" "GBK" "UTF-8"三种.

4.创建XML文档

使用ASP创建XML文档的例子
<%
response.ContentType="text/xml"
response.Write("<?xml version='1.0' encoding='gb2312'?>")
response.Write("<note>")
response.Write("<from>壹</from> ")
response.Write("<to>贰</to>")
response.Write("<message>叁</message> ")
response.Write("</note>")
%>

服务器端从数据库读去数据动态生成XML文档的例子
<%
response.ContentType = "text/xml"
set conn=Server.CreateObject("ADODB.Connection")
conn.provider="Microsoft.Jet.OLEDB.4.0;"
conn.open server.mappath("../ado/database.mdb")
sql="select fname,lname from tblGuestBook"
set rs=Conn.Execute(sql)
rs.MoveFirst()
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()
wendrs.close()
conn.close()
response.write("</guestbook>")
%>

5.XML在HTML中的应用

通过数据岛,可以把XML文档引入到HTML页面中.
HTML代码: <xml src="price.xml" id="xmldso" async="false"></xml>
上句意为将一个名为price.xml的文件载入到一个定义为xmldso的数据岛中,而async="false"是在HTML处理XML数据之前,必须确保文档中所有数据被载入.

然后就是把数据岛绑定到HTML元素上(datasrc="#数据岛名称"),
接着将数据岛中的元素字段绑定到HTML元素其本身或者其子元素上(datafld="XML中的元素名称").

<table datasrc="#xmldso">
<thead>
<th>Title</th>
<th>Artist</th>
<th>Year</th>
</thead>
<tr>
<td><span datafld="TITLE"></span></td>
<td><span datafld="ARTIST"></span></td>
<td><span datafld="YEAR"></span></td>
</tr></table>

此外也可以像这样绑定
<span datasrc="#xmldso" datafld="TITLE"></span>
这样会只显示一条纪录.

一个添加导航的例子
<html>
<head>
<script type="text/javascript">
function movenext()
{
x=xmldso.recordset
if (x.absoluteposition < x.recordcount)
{
x.movenext()
}
}
function moveprevious()
{
x=xmldso.recordset
if (x.absoluteposition > 1)
{
x.moveprevious()
}
}
</script>
</head>
<body>
<xml src="price.xml"  id="xmldso" async="false"></xml>
<p>
Title:
<span datasrc="#xmldso" datafld="TITLE"></span>
<br />Artist:
<span datasrc="#xmldso" datafld="ARTIST"></span>
<br />Year:
<span datasrc="#xmldso" datafld="YEAR"></span>
</p>
<p>
<input type="button" value="上一个"
onclick="moveprevious()" />
<input type="button" value="下一个"
onclick="movenext()" />
</p>
</body>
</html>

一个以归档方式显示点击数据的例子

<head>
<script type="text/javascript">
function testclick(field)
{
var row=field.rowIndex
xmldso_list.recordset.absoluteposition=row
td_title.innerHTML=xmldso_list.recordset("TITLE")
td_artist.innerHTML=xmldso_list.recordset("ARTIST")
td_country.innerHTML=xmldso_list.recordset("COUNTRY")
}
</script>
</head>
<xml id="xmldso_list" src="price.xml"></xml>
<table bgcolor="pink">
<tr><th>Title:  </th><td id="td_title"></td></tr>
<tr><th>Artist: </th><td id="td_artist"></td></tr>
<tr><th>Country:</th><td id="td_country"></td></tr>
</table>
<p><b>点击下面的列表观看归档</b><p>
<table datasrc="#xmldso_list" border="1">
<thead>
<tr><th>Title</th><th>Artist</th><th>Country</th></tr>
</thead>
<tr align="left" onClick="testclick(this)">
<td><div datafld="TITLE"></td>
<td><div datafld="ARTIST"></td>
<td><div datafld="COUNTRY"></td>
</tr>
</table>

6.XML HTTP请求

以下为向服务器请求得到XML数据
var objHTTP = new ActiveXObject("Microsoft.XMLHTTP")
objHTTP.Open('GET','note.xml',false)
objHTTP.Send()

一个详细的JavaScript脚本例子
<html>
<head>
<script type="text/javascript">
function getPage()
{
var objHTTP = new ActiveXObject("Microsoft.XMLHTTP")
objHTTP.Open('GET','note.xml',false)
objHTTP.Send()
document.all['A1'].innerText= objHTTP.status
document.all['A2'].innerText= objHTTP.statusText
document.all['A3'].innerText= objHTTP.responseText
}
</script>
</head>
<body onload="getPage()">
<span ID="A1"></span>
<span ID="A2"></span>
<span ID="A3"></span>
</body>
</html>

7.XML行为

行为(behavior)是一个CSS属性选择器.它指向一个包含了特殊代码并且能够改变HTML页面元素的XML文件(htc).
行为是一个新的CSS属性,是一种可以把脚本程序完全从HTML页面中分离出来的方法.
调用方法:
<style>
Div { behavior: url(behave.htc) }
</style>

而behave.htc又是一个XML文档.内容如下.
<component>
<attach for="element" event="onmouseover"
handler="hig_lite" />
<attach for="element" event="onmouseout"
handler="low_lite" />
<script type="text/javascript">
function hig_lite()
{
element.style.color=255
}
function low_lite()
{
element.style.color=0
}
</script>
</component>

XML相关技术
发表评论
撰写评论