ASP XML编程objXML.async = False

时间:2021-10-25 00:02:58

从技术上来说,在ASP环境中,读入并管理XML文本的主要方法有三种: 
创建MSXML对象,并且将XML文档载入DOM; 
使用服务器端嵌入(Server-Side Include,SSI); 
就如同访问其他文本文件一样,使用FileSystemObject来访问XML文档; 
第四种方法是在客户端创建内置的数据岛,有关的内容以后讲解。 
一、使用DOM 
为了在ASP代码中使用DOM,需要创建一个Microsoft XML分析器的实例,它像任何别的COM组件一样被实例化,在页面的开始处顼要增加几行标准代码。这些代码创建一个分析器实例,加载XML文档至DOM,并且将根元素(即文档元素)设置为当前节点。 
‘Instatiate the XML Processor 
Set objXML = Server.CreateObject("Microsoft.XMLDOM") 
Load the XML Document 
objXML.load(Server.MapPath("mydata.xml") 
Set the Document Element 
Set objRootElement = objXML.documentElement 
在XML文档被加载之前,还需要执行第四步,即设置validateOnParse属性为True,这可确保被加载的文档为有效的XML文档。这可避免后面遇到的各种麻烦: 
Instatiate the XML Processor 
Set objXML = Server.CreateObject("Microsoft.XMLDOM") 
The processos should validate the document 
objXML.validateOnParse = True 
Load the XML Document 
objXML.load(Server.MapPath("mydata.xml") 
Set the Document Element 
Set objRootElement = objXML.documentElement 
最后,还有一个可选步骤,它也是出现在加载之前。它要求同步加载文件: 
objXML.async = false 
这说时加载并验证一个相当大的文件需要占用一些时间。另一种替换方案是忽略这一步,允许非同步加载,这是缺省情况,一旦完成这些初始化步骤,XML文档就被加载,并且做好了被处理的准备。DOM所有重要的功能都是可配置的。 
当然,就如同任何COM对象一样,在使用完之后,请记住必须销毁它: 
Set objXML = nothing 
二、服务器端嵌入 
服务器端嵌入可用于将XML文档代码插入ASP页面。 
三、用ASP代码处理XML的示例 
<HTML> 
<HEAD> 
</HEAD> 
<BODY> 
<% 
Dim sourceFile,source,rootElement,HTMLCode 
sourceFile = Request.ServerVariables("APPL_PHYSICAL_PATH") & "xml\contacts.xml" 
set source = Server.CreateObject("Microsoft.XMLDOM") 
source.async = false 
source.load sourceFile 
set rootElement = source.documentElement 
HTMLCode = HTMLCode & "<font size=4 face=verdana>" 
HTMLCode = HTMLCode & rootElement.childNodes(0).text 
HTMLCode = HTMLCode & "</font><p></p><font size=3 face=verdana><I>" 
HTMLCode = HTMLCode & rootElement.childNodes(0).text 
HTMLCode = HTMLCode & "</I></font><p></p><font size=3 face=verdana>" 
HTMLCode = HTMLCode & rootElement.childNodes(0).text 
HTMLCode = HTMLCode & "</font><p></p>" 
response.write(HTMLCode) 
set source = nothing 
%> 
</BODY> 
</HTML> 
contacts.xml 
<?xml version="1.0" ?> 
<CONTACT_INFO> 
<CONTACT> 
<NAME>JOHN</NAME> 
<PHONE>111-1111-111</PHONE> 
</CONTACT> 
<CONTACT> 
<NAME>SMITH</NAME> 
<PHONE>222-2222-222</PHONE> 
</CONTACT> 
<CONTACT> 
<NAME>MIKE</NAME> 
<PHONE>333-3333-333</PHONE> 
</CONTACT> 
</CONTACT_INFO> 
经XSL格式化的XML数据 
styleContact.asp 
<HTML> 
<BODY> 
<% 
sourceFile = server.mapPath("contact.xml") 
styleFile = server.mapPath("contact.xsl") 
set source = Server.CreateObject("Microsoft.XMLDOM") 
source.async = False 
source.load(sourceFile) 
set style = Server.CreateObject("Microsoft.XMLDOM") 
style.async = False 
style.load(styleFile) 
response.write(source.transformNode(style)) 
%> 
</BODY> 
</HTML> 
contact.xml 
<?xml version="1.0" ?> 
<?xml-stylesheet type="text/xsl" href="contact.xsl" ?> 
<CONTACT_INFO> 
<CONTACT> 
<NAME>ZHOU.ZF</NAME> 
<PHONE>11111111111</PHONE> 
</CONTACT> 
<CONTACT> 
<NAME>LISTEN</NAME> 
<PHONE>22222222222</PHONE> 
</CONTACT> 
<CONTACT> 
<NAME>BUBU</NAME> 
<PHONE>33333333333</PHONE> 
</CONTACT> 
</CONTACT_INFO> 
contact.xsl 
<?xml version="1.0" ?> 
<xsl:template xmlns:xsl="http://www.w3.org/TR/WD-xsl"> 
<HTML> 
<BODY> 
<xsl:for-each select="CONTACT_INFO/CONTACT"> 
<DIV> 
<xsl:value-of select="NAME"/> 
</DIV> 
</xsl:for-each> 
</BODY> 
</HTML> 
</xsl:template> 

其它示例: 
1、WEB链接 
<HTML> 
<BODY> 
<% 
Dim objXML, objRootElement, strLinkName, strLinkURL, strLinkTarget, sourceFile, i 
sourceFile = Request.ServerVariables("APPL_PHYSICAL_PATH") & "xml\Links.xml" 
set objXML = Server.CreateObject("Microsoft.XMLDOM") 
objXML.validateOnParse = True 
objXML.async = false 
objXML.load(sourceFile) 
set objRootElement = objXML.documentElement 
for i = 0 to objRootElement.childNodes.length-1 
strLinkName = objRootElement.childNodes.item(i).text 
strLinkURL = objRootElement.childNodes.item(i).getAttribute("url") 
strLinkTarget = objRootElement.childNodes.item(i).getAttribute("target") 
response.write("<a href=" & strLinkURL & " target=" & strLinkTarget & ">" & strLinkName & "</a><br>") 
next 
set objXML = nothing 
%> 
</BODY> 
</HTML> 
Links.xml 
<?xml version="1.0" ?> 
<relatedlinks> 
<link url="default0.asp" target="_blank">Front Page 0</link> 
<link url="default1.asp" target="_blank">Front Page 1</link> 
<link url="default2.asp" target="_blank">Front Page 2</link> 
<link url="default3.asp" target="_blank">Front Page 3</link> 
</relatedlinks> 
2、XML文件的生成 
gen_xml.asp 
<HTML> 
<HEAD> 
<META NAME="GENERATOR" Content="Microsoft Developer Studio"> 
<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1"> 
<TITLE>Generate XML</TITLE> 
</HEAD> 
<BODY> 
<% 
Create an empty root node for the document. 
Set rootNode = Server.CreateObject("AspXml.AspXml") 
rootNode.Encoding = "ISO-8859-1" 
rootNode.Standalone = "yes" 
rootNode.Tag = "table" 
for row = 1 to 10 
Set rowNode = rootNode.NewChild("row","") 
for col = 1 to 10 
Set colNode = rowNode.NewChild("column","("&col&","&row&")") 
next 
next 
rootNode.SaveXml(Server.MapPath("table.xml")) 
Set rootNode = Nothing 
%> 
</BODY> 
</HTML> 
3、向XML文件中追加结点 
addItem.asp 
<% 
If request.ServerVariables("REQUEST_METHOD")="POST" Then 
call writeXML 
Else 
call showForm 
End If 
Sub showForm 
%> 
<html> 
<body> 
Please enter the persons contact details 
<form action="addItem.asp" method="post"> 
Name: <input type="text" name="name"> Email: <input type="text" name="email"> 
<input type="submit" name="submit" value="Add"> 
</form> 
</body> 
</html> 
<% 
End Sub 
Sub writeXML 
find xml file path 
Dim strFilename,strXMLFile 
strFilename = "contacts.xml" 
strXMLFile=server.mapPath(strFilename) 
standard "create xml object" code 
set oXML = server.createObject("Microsoft.XMLDOM") 
oXML.async = False 
check file exists 
bitFileExists = oXML.load(strXMLFile) 
If bitFileExists Then 
tmpChildnodes = oXML.documentElement.childnodes.length - 1 
intCurrentRecord = tmpChildnodes + 1 
Else 
create xml 
oXML.appendChild(oXML.createProcessingInstruction("xml","version=""1.0""")) 
oXML.appendChild(oXML.createElement("contacts")) 
intCurrentRecord = 0 
End If 
create record 
set oXMLRec = oXML.createElement("contact") 
Create an id attribute 
Set oAtt = oXML.createAttribute("id") 
oAtt.Text = intCurrentRecord 
oXMLRec.setAttributeNode oAtt 
set remaining fields 
name 
oXMLRec.appendChild(oXML.createElement("name")) 
oXMLRec.childnodes(0).text = request.form("name") 
email address 
oXMLRec.appendChild(oXML.createElement("email")) 
oXMLRec.childnodes(1).text = request.Form("email") 
date stamp 
oXMLRec.appendChild(oXML.createElement("created")) 
oXMLRec.childnodes(2).text = now() 
write new record 
oXML.documentElement.appendChild(oXMLRec.cloneNode(True)) 
save file 
oXML.save strXMLFile 
redirect to xml file 
response.redirect(strFilename) 
oXML = nothing 
End Sub 
%> 
contacts.xml 
<?xml version="1.0"?> 
<CONTACT_INFO> 
<contact id="1"> 
<name>bubu</name> 
<email>zhou813@163.com</email> 
<created>2003/04/29 9:26:51</created> 
</contact> 
<contact id="2"> 
<name>22222</name> 
<email>222222222</email> 
<created>2003-5-12 18:15:41</created> 
</contact> 
</CONTACT_INFO> 
4、留言薄 
<% 
username=request.form("username") 
if username<>"" then 
fromwhere =request.form("fromwhere") 
homepage =request.form("homepage") 
email =request.form("email") 
text =Server.URLEncode(request.form("text")) 
Posttime =now() 
sourceFile = "list.xml" 
strSourceFile = Server.MapPath(sourceFile) 
Set objXML = Server.CreateObject("Microsoft.XMLDOM") 
blnRet = objXML.load(strSourceFile) 
If blnRet Then 
Set objRootlist = objXML.documentElement 
if objRootlist.hasChildNodes then 
id = objRootlist.lastchild.firstchild.text+1 
else 
id=1 
end if 
Else 
objXML.appendChild(objXML.createProcessingInstruction("xml","version=""1.0""")) 
set objRootlist = objXML.createElement("NewList") 
objXML.appendChild(objRootlist) 
id = 1 
End If 
brstr=chr(13)&chr(10)&chr(9) 
XMLnode=brstr&"<list>"&brstr & _ 
"<id>"&id&"</id>"&brstr & _ 
"<username>"&username&"</username>"&brstr & _ 
"<fromwhere>"&fromwhere&"</fromwhere>"&brstr & _ 
"<Posttime>"&Posttime&"</Posttime>"&brstr & _ 
"<homepage>"&homepage&"</homepage>"&brstr & _ 
"<email>"&email&"</email>"&brstr & _ 
"<text>"&text&"</text>"&brstr & _ 
"</list>"&chr(13) 
set objXML2=Server.CreateObject("Microsoft.XMLDOM") 
objXML2.loadXML(XMLnode) 
set rootNewNode=objXML2.documentElement 
objRootlist.appendChild(rootNewNode) 
objXML.save(strSourceFile) 
set objXML=nothing 
set objXML2=nothing 
response.redirect(strSourceFile) 
end if 
%> 
<html> 
<head> 
<title>Untitled Document</title> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<style type="text/css"> 
<!-- 
td { font-size: 9pt} 
--> 
</style> 
</head> 
<body bgcolor="#0099CC" text="#000000"> 
<table width="80%" border="0" cellspacing="1" cellpadding="4" align="center" bgcolor="#FFFFFF"> 
<form action="PostNew.asp" method="post" name="form1"> 
<tr bgcolor="#000000"> 
<td colspan="2"><font color="#FFFFFF">New Book</font></td> 
</tr> 
<tr bgcolor="#EFEFEF"> 
<td width="19%" align="right">Name:</td> 
<td width="81%"> 
<input type="text" name="username">** 
</td> 
</tr> 
<tr bgcolor="#EFEFEF"> 
<td width="19%" align="right">ComeFrom:</td> 
<td width="81%"> 
<input type="text" name="fromwhere" value="China"> 
</td> 
</tr> 
<tr bgcolor="#EFEFEF"> 
<td width="19%" align="right">WebSite:</td> 
<td width="81%"> 
<input type="text" name="homepage" value="http://"> 
</td> 
</tr> 
<tr bgcolor="#EFEFEF"> 
<td width="19%" align="right">Email:</td> 
<td width="81%"> 
<input type="text" name="email"> 
</td> 
</tr> 
<tr bgcolor="#EFEFEF"> 
<td width="19%" align="right" valign="top">Context:</td> 
<td width="81%"> 
<textarea name="text" cols="60" rows="10"></textarea> 
</td> 
</tr> 
<tr bgcolor="#EFEFEF"> 
<td width="19%" align="right"> </td> 
<td width="81%"> 
<input type="submit" name="Submit" value="Submit"> 
<input type="reset" name="Submit2" value="Reset"> 
</td> 
</tr> 
</form> 
</table> 
</body> 
</html> 
四、使用DOM生成XML总结 
了解XML文档对象模型 
XML DOM包含四个主要对象:XMLDOMDocument, XMLDOMNode,XMLDOMNodeList和XMLDOMNamedNodeMap。同任何其它对象模型一样,每个XML DOM对象有其自己的特性和方法。本文,我们将主要介绍XMLDOMDocument 和XMLDOMNode 对象。 
XMLDOMDocument对象 
XMLDOMDocument对象代表XML DOM层次中的顶层结点(请不要同XML文档中的根结点混淆)。它是建立和操纵XML结构的基础。为了创建XMLDOMDocument对象变量,请使用如下的CreateObject 命令: 
Set objXMLdoc = CreateObject("Microsoft.XMLDOM") 
表A:列出了在创建了XMLDOMDocument的对象后,我们可以得到的一些特性和方法。 
方法 描述 
CreateAttribute 创建新属性 
CreateCDATASection 创建DATA 部分结点 
CreateComment 创建注释结点 
CreateElement 使用指定名称创建元素结点 
CreateEntityReference 创建实体参考对象 
CreateNode 创建结点 
CreateTextNode 创建文本结点 
Load 载入已有的 XML 文档 
Save 保存XML 文档 
特性 描述 
PreserveWhiteSpace 指示是否在XML文档中显示空格t 
ResolveExternals 解析名域,DTD和外部实体索引 
ValidateOnParse 指示解析器是否对文档进行合法性检查 
DocumentElement 返回XML 文档的根结点 
设置运行选项 
正如你在表A中所看到的,只有创建了XMLDOMDocument 对象,你才可创建单个的XML结点。在做这个工作之前,你还可以设置XML文档的解析运行条件,如果你打算直接生成XML文档到浏览器时,就很有用处。 
运行选项可以让你设置异步下载,提供文档合法性检查和保留空格,以及解析外部索引。为了防止异步下载,可设置asynch特性为False。如果打算用一行新字符代替空格,可设置PreserveWhiteSpace 特性为True。 ResolveExternals特性可防止解析引擎解析外部实体索引,文档类型定义或者外部名域。 
1、创建结点 
XMLDOMDocument 对象提供了创建结点或者XMLDOMNode的两种方法: CreateElement 和CreateNode。选择其中哪一种方法,取决于你需要结点提供信息量的多少。当你使用CreateElement 方法时,只要提供结点名称,如 
Set objXMLroot = objXMLdoc.CreateElement("ORDER_STATUS") 
当使用CreateNode 方法时,你要指定结点类型,结点名称和相关名域。(XML名域可以让你择同一文档中用同一名称创建多个XML元素) 例如,如果要使用CreateNode方法,你可写出如下代码: 
Set objXMLroot = objXMLdoc.createNode("element","ORDER_STATUS","Space1") 
一旦创建了结点,你须把它添加进XML文档中。这就要用AppendChild 方法,例如,继续上面的例子,你可以写出: 
objXMLdoc.AppendChild(objXMLroot) 
该语句创建了XML根结点。 
除了AppendChild方法外,XMLDOMNode 对象也具有其它三个控制XML结点的方法: ReplaceChild, RemoveChild和InsertBefore 
2、对结点的属性赋值 
一旦创建了结点,还要对其属性赋值,如独立的标识符,或者特性值。你要用到SetAttribute方法。该方法接收两个参数— 属性名和属性值。例如,下列代码创建了属性名SHIPPING_DATASOURCE 和属性值NORTH_ATLANTIC_SHIPPING: 
objXMLroot.SetAttribute "SHIPPING_DATASOURCE","NORTH_ATLANTIC_SHIPPING" 
此时,我们生成了一个XML文档,SetAttributes方法创建了结点属性 。 
3、加入子结点 
要创建子结点,你可以使用我们前面介绍的CreateElement或者 CreateNode 方法,然后把它们添加到合适的父母结点中。例如,假设,我们要创建称为PUBLISHER_DISCLAIMER的XML结点。为了做到这一点,我们把该结点附加到文档的根结点中,代码如下: 
Set objXMLChildTestNode = objXMLdoc.createNode("element","PUBLISHER_DISCLAIMER","") 
objXMLdoc.DocumentElement.appendChild(objXMLChildTestNode) 
注意:我们使用了XMLDOMDocument的 DocumentElement 特性来把新结点添加到XML文档的根结点中,要添加子结点,你只需把它们添加到父母结点中。 
4、给结点赋值 
一旦创建完所有的结点,你将需要给它们赋值。那是XML最关键的步骤。要做到这点,你同平常一样,创建一个结点,然后对该结点的TEXT属性赋值。