VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 网站开发 > ASPnet >
  • asp.net教程之将SAX加入我们的ASP应用中

在处理大型的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 
%> 

相关教程