分享
 
 
 

将SAX加入我们的ASP应用中

王朝asp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

在处理大型的XML文档的时候,在服务器端直接使用XML DOM的时候速度是比较慢的,当我第一次接触到SAX的时候,我意识到我们应该在服务器端将DOM和SAX结合起来以提高我们程序的效率。我们在ASP中最常使用的就是使用COM来完成这个工作(也许你有更好的方法)。

废话少说,还是直接进入实际的代码部分了(下面只是包含了最基本的代码而已)。

首先我们创建一个DLL来封装SAX的功能好了。

测试环境:Win2k Prof.+MSXML3.0 sp1+VB6

要使用SAX我们必须引用(Reference)Microsoft XML 3.0(我的机器安装的是MSXML3.0 sp1)

工程名:SAXTesting

类名:clsSAXTest

方法:Public Function MyXMLParser(XML文件物理路径) as DOMDocument

代码:

Option Explicit

Public Function MyXMLParser(ByVal strXMLFilePath As Variant) As DOMDocument

Dim reader As New SAXXMLReader

Dim contentHandler As New ContentHandlerImpl

Dim errorHandler As New ErrorHandlerImpl

Set reader.contentHandler = contentHandler

Set reader.errorHandler = errorHandler

On Error GoTo ErrorHandle

Dim XMLFile As String

XMLFile = strXMLFilePath

reader.parseURL (XMLFile)

Dim xmlDoc As MSXML2.DOMDocument

Set xmlDoc = CreateObject("MSXML2.DOMDocument")

xmlDoc.loadXML strXML

Set MyXMLParser = xmlDoc

Set xmlDoc = Nothing

Exit Function

ErrorHandle:

Err.Raise 9999, "My XML Parser", Err.Number & " : " & Err.Description

End Function

类名:modPublic

代码:

Option Explicit

Global strXML As String

类名:ContentHandlerImpl

代码:

Option Explicit

Implements IVBSAXContentHandler

Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As String,

strQName As String, ByVal attributes As MSXML2.IVBSAXAttributes)

Dim i As Integer

intLocker = intLocker + 1

If intLocker > 1 Then

End If

strXML = strXML & "<" & strLocalName

For i = 0 To (attributes.length - 1)

strXML = strXML & " " & attributes.getLocalName(i) & "=""" & attributes.getValue(i) &

""""

Next

strXML = strXML & ">"

If strLocalName = "qu" Then

Err.Raise vbObjectError + 1, "ContentHandler.startElement", "Found element <qu>"

End If

End Sub

Private Sub IVBSAXContentHandler_endElement(strNamespaceURI As String, strLocalName As String,

strQName As String)

strXML = strXML & "</" & strLocalName & ">"

End Sub

Private Sub IVBSAXContentHandler_characters(text As String)

text = Replace(text, vbLf, vbCrLf)

strXML = strXML & text

||||||End Sub

Private Property Set IVBSAXContentHandler_documentLocator(ByVal RHS As MSXML2.IVBSAXLocator)

End Property

Private Sub IVBSAXContentHandler_endDocument()

End Sub

Private Sub IVBSAXContentHandler_endPrefixMapping(strPrefix As String)

End Sub

Private Sub IVBSAXContentHandler_ignorableWhitespace(strChars As String)

End Sub

Private Sub IVBSAXContentHandler_processingInstruction(target As String, data As String)

strXML = strXML & "<?" & target & " " & data & ">"

End Sub

Private Sub IVBSAXContentHandler_skippedEntity(strName As String)

End Sub

Private Sub IVBSAXContentHandler_startDocument()

End Sub

Private Sub IVBSAXContentHandler_startPrefixMapping(strPrefix As String, strURI As String)

End Sub

类名:ErrorHandlerImpl

代码:

Option Explicit

Implements IVBSAXErrorHandler

Private Sub IVBSAXErrorHandler_fatalError(ByVal lctr As IVBSAXLocator, msg As String, ByVal

errCode As Long)

strXML = strXML & "*** error *** " & msg

End Sub

Private Sub IVBSAXErrorHandler_error(ByVal lctr As IVBSAXLocator, msg As String, ByVal errCode As

Long)

End Sub

Private Sub IVBSAXErrorHandler_ignorableWarning(ByVal oLocator As MSXML2.IVBSAXLocator,

strErrorMessage As String, ByVal nErrorCode As Long)

End Sub

OK,让我们编译这个DLL,应该是没什么问题了。让我们在ASP中看看运行的结果怎么样:

XML文件:

<?xml version="1.0"?>

<root foo="bar.com">

<PARTS>

<PART foo="bar.com" foo2="bar.com">

<PARTNO>12345</PARTNO>

<DESCRIPTION>VIP - Very Important Part</DESCRIPTION>

</PART>

<PART>

<PARTNO>5678</PARTNO>

<DESCRIPTION>LIP - Less Important Part</DESCRIPTION>

</PART>

</PARTS>

</root>

ASP文件:

<%

Set a = CreateObject("SAXTesting.clsSAXTest")

Set xmlDoc = a.MyXMLParser("D:\test.xml")

Response.contenttype="text/xml"

response.write xmlDoc.xml

set xmlDoc=nothing

set a=nothing

%>

看看结果:-)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有