在 HTML 中显示 XML 数据
<html>
<body>
<script type="text/javascript">
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","/example/xmle/cd_catalog.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
document.write("<table border='1'>");
var x=xmlDoc.getElementsByTagName("CD");
for (i=0;i<x.length;i++)
{
document.write("<tr><td>");
document.write(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td><td>");
document.write(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
document.write("</td></tr>");
}
document.write("</table>");
</script>
</body>
</html>
解析 XML 字符串
下面的 JavaScript 代码片段把 XML 字符串解析到 XML DOM 对象中(把字符串 txt 载入解析器):
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);
}
注释:Internet Explorer 使用 loadXML() 方法来解析 XML 字符串,而其他浏览器使用 DOMParser 对象。
注释:loadXML() 方法用于加载字符串(文本),load() 用于加载文件。
解析 XML 文件 - 跨浏览器实例
下列代码把一个 XML 文档 ("note.xml") 载入 XML 解析器中:
<html>
<body>
<h1>W3School.com.cn Internal Note</h1>
<p><b>To:</b> <span id="to"></span><br />
<b>From:</b> <span id="from"></span><br />
<b>Message:</b> <span id="message"></span>
<script type="text/javascript">
if (window.XMLHttpRequest)
{// code for IE7+,"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>
XML 的应用
<html>
<head>
<script type="text/javascript">
if (window.XMLHttpRequest)
{// code for IE7+,false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
x=xmlDoc.getElementsByTagName("CD");
function displayCDInfo(i)
{
artist=(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
title=(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
year=(x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue);
country=(x[i].getElementsByTagName("COUNTRY")[0].childNodes[0].nodeValue);
company=(x[i].getElementsByTagName("COMPANY")[0].childNodes[0].nodeValue);
price=(x[i].getElementsByTagName("PRICE")[0].childNodes[0].nodeValue);
txt="Artist: "+artist+"<br />Title: "+title+"<br />Year: "+year+"<br />Country: "+country+"<br />Company: "+company+"<br />Price: "+price ;
document.getElementById("showCD").innerHTML=txt;
}
</script>
</head>
<body>
<div id='showCD'>点击某个 CD 就可显示专辑信息:</div><br />
<script type="text/javascript">
document.write("<table border='1'>");
for (var i=0;i<x.length;i++)
{
document.write("<tr onclick='displayCDInfo(" + i + ")'>");
document.write("<td>");
document.write(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td><td>");
document.write(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
document.write("</td></tr>");
}
document.write("</table>");
</script>
</body>
</html>
在 XML 中有 5 个预定义的实体引用:
< < 小于
> > 大于
& & 和号
' ' 省略号
" " 引号
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>
在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。
关于 CDATA 部分的注释:
CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。
标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。
在服务器上存储 XML
XML 文件在 Internet 服务器上进行存储的方式与 HTML 文件完全相同。
请打开 Windows 记事本,并输入以下代码:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<from>John</from>
<to>George</to>
<message>Don't forget the meeting!</message>
</note>
然后用适当的文件名,比如 "note.xml",在 web 服务器上保存这个文件。
通过 ASP 生成 XML
XML 可在不安装任何 XML 软件的情况下在服务器端生成。
如需从服务器生成 XML 响应 - 只需简单地编写以下代码并在服务器上把它保存为一个 ASP 文件:
<%
response.ContentType="text/xml"
response.Write("<?xml version='1.0' encoding='ISO-8859-1'?>")
response.Write("<note>")
response.Write("<from>John</from>")
response.Write("<to>George</to>")
response.Write("<message>Don't forget the meeting!</message>")
response.Write("</note>")
%>
请注意,此响应的内容类型必须设置为 "text/xml"。
查看这个ASP文件如何从服务器返回
如果您还不懂如何编写 ASP,请访问我们的《ASP 教程》。
如需使用 PHP 在服务器上生成 XML 响应,请使用下面的代码:
<?PHP
header("Content-type:text/xml");
echo "<?xml version='1.0' encoding='ISO-8859-1'?>";
echo "<note>";
echo "<from>John</from>";
echo "<to>George</to>";
echo "<message>Don't forget the meeting!</message>";
echo "</note>";
?>
请注意,响应头部的内容类型必须设置为 "text/xml"。
如需从服务器生成 XML 数据库响应,只需简单地编写以下代码,并把它在服务器上保存为 ASP 文件:
<%
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 FirstName,LastName from Persons"
set rs=Conn.Execute(sql)
rs.MoveFirst()
response.write("<?xml version='1.0' encoding='ISO-8859-1'?>")
response.write("<Customers>")
while (not rs.EOF)
response.write("<Person>")
response.write("<FirstName>" & rs("FirstName") & "</FirstName>")
response.write("<LastName>" & rs("LastName") & "</LastName>")
response.write("</Person>")
rs.MoveNext()
wend
rs.close()
conn.close()
response.write("</Customers>")
%>
上面的例子使用了带有 ADO 的 ASP。
如果您需要学习 ADO,请访问我们的《ADO 教程》。
在服务器上通过 XSLT 转换 XML
下面的 ASP 代码在服务器上把 XML 文件转换为 XHTML:
<%
'Load XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("simple.xml"))
'Load XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("simple.xsl"))
'Transform file
Response.Write(xml.transformNode(xsl))
%>
例子解释
1.第一个代码块创建微软 XML 解析器的实例 (XMLDOM),并把 XML 文件载入内存
2.第二个代码块创建解析器的另一个实例,并把 XSL 文件载入内存
3.最后一个代码使用 XSL 文档来转换 XML 文档,并把结果以 XHTML 发送到您的浏览器。完工。
看看上面的代码怎么运行
通过 ASP 把 XML 保存为文件
这个 ASP 实例会创建一个简单的 XML 文档,并把该文档保存到服务器上:
<%
text="<note>"
text=text & "<to>George</to>"
text=text & "<from>John</from>"
text=text & "<heading>Reminder</heading>"
text=text & "<body>Don't forget the meeting!</body>"
text=text & "</note>"
set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.loadXML(text)
xmlDoc.Save("test.xml")
%>
真实的表单例子
现在,我们看一个真实的表单例子。
我们首先看一下这个被用在例子中的 HTML 表单:下面的HTML表单要求用户输入他们的名字、国籍以及电子邮件地址。随后这些信息会被写到一个 XML 文件,以便存储。
"customers.htm":
<html>
<body>
<form action="saveForm.asp" method="post">
<h1>请输入您的联系信息:</h1>
<label>名字: </label>
<p><input type="text" id="firstName" name="firstName"></p>
<label>姓氏: </label>
<p><input type="text" id="lastName" name="lastName"></p>
<label>国家: </label>
<p><input type="text" id="country" name="country"></p>
<label>邮件: </label>
<p><input type="text" id="email" name="email"></p>
<p>
<input type="submit" id="btn_sub" name="btn_sub" value="Submit">
<input type="reset" id="btn_res" name="btn_res" value="Reset">
</p>
</form>
</body>
</html>
用于以上 HTML 表单的 action 被设置为 "saveForm.asp"。"saveForm.asp" 文件是一个 ASP 页面,可循环遍表单域,并把它们的值存储在一个 XML 文件中:
<%
dim xmlDoc
dim rootEl,fieldName,fieldValue,attID
dim p,i
'如果有错误发生,不允许程序终止
On Error Resume Next
Set xmlDoc = server.CreateObject("Microsoft.XMLDOM")
xmlDoc.preserveWhiteSpace=true
'创建并向文档添加根元素
Set rootEl = xmlDoc.createElement("customer")
xmlDoc.appendChild rootEl
'循环遍历 Form 集
for i = 1 To Request.Form.Count
'除去表单中的 button 元素
if instr(1,Request.Form.Key(i),"btn_")=0 then
'创建 field 和 value 元素,以及 id 属性
Set fieldName = xmlDoc.createElement("field")
Set fieldValue = xmlDoc.createElement("value")
Set attID = xmlDoc.createAttribute("id")
'把当前表单域的名称设置为 id 属性的值
attID.Text = Request.Form.Key(i)
'把 id 属性添加到 field 元素
fieldName.setAttributeNode attID
'把当前表单域的值设置为 value 元素的值
fieldValue.Text = Request.Form(i)
'将 field 元素作为根元素的子元素进行添加
rootEl.appendChild fieldName
'将 value 元素作为 field 元素的子元素进行添加
fieldName.appendChild fieldValue
end if
next
'添加 XML processing instruction
'并把它加到根元素之前
Set p = xmlDoc.createProcessingInstruction("xml","version='1.0'")
xmlDoc.insertBefore p,xmlDoc.childNodes(0)
'保存 XML 文件
xmlDoc.save "c:\Customer.xml"
'释放所有的对象引用
set xmlDoc=nothing
set rootEl=nothing
set fieldName=nothing
set fieldValue=nothing
set attID=nothing
set p=nothing
'测试是否有错误发生
if err.number<>0 then
response.write("Error: No information saved.")
else
response.write("Your information has been saved.")
end if
%>
注释:如果指定的 XML 文件名已经存在,那个文件会被覆盖!
XML 文件会由上面的代码生成,大致的样子是这样的:("Customer.xml"): <?xml version="1.0" ?> <customer> <field id="firstName"> <value>David</value> </field> <field id="lastName"> <value>Smith</value> </field> <field id="country"> <value>China</value> </field> <field id="email"> <value>mymail@myaddress.com</value> </field> </customer>