此代码使用 MSXML SAX 编写大量 XML,通过测试输出的大小将其分解为更小的文件。
它需要一个像MXXMLWriter.output 这样的IStream,而我们没有在VB6 中直接在磁盘上打开这样的对象,所以这里使用了对“olelib”类型库的引用。您可以通过以下方式获得:
Namespace Edanmo Visual Basic 6 OLELIB.TLB - OLE interfaces & functions v1.7
这是用于此类事情的广泛使用的类型库。该链接上的版本目前实际上是 1.81。
代码有一个循环,可以写出简单的虚拟 XML,从 1 迭代到 NUM_DETAIL_ELEMS。每FILE_LIMIT_BYTES 个输出都会在一个新文件上打开一个新的输出流。为了检查这一点,每次CHECK_LIMIT_INTERVAL 迭代,MXXMLWriter 都会刷新到流中,并检查流的字节大小。
真的很基本。
Option Explicit
'
'Simple demonstration of using MSXML SAX to create an XML document.
'
'Requires a reference to:
'
' Edanmo's OLE interfaces and functions v 1.81 or similar.
'
Private Stream As olelib.IStream
Private Sub StreamOpen(ByVal FileName As String)
Set Stream = _
olelib.SHCreateStreamOnFile(FileName, _
STGM_CREATE _
Or STGM_WRITE _
Or STGM_SHARE_EXCLUSIVE)
End Sub
Private Sub StreamClose()
Set Stream = Nothing
End Sub
Private Function StreamLength() As Long
Dim STATSTG As olelib.STATSTG
Stream.Stat STATSTG, STATFLAG_NONAME
'Convert pseudo-Currency ULARGE_INTEGER to Long:
StreamLength = STATSTG.cbSize * 10000@
End Function
Private Function StreamIsOpen() As Boolean
StreamIsOpen = Not Stream Is Nothing
End Function
Private Sub cmdCreate_Click()
Const CHECK_LIMIT_INTERVAL As Long = 100
Const FILE_LIMIT_BYTES As Long = 1000000
Const NUM_DETAIL_ELEMS As Long = 100000
Dim Attributes As SAXAttributes
Dim Writer As MSXML2.MXXMLWriter
Dim Handler As MSXML2.IVBSAXContentHandler
Dim I As Long
Dim FileNum As Long
Set Attributes = New MSXML2.SAXAttributes
Set Writer = New MSXML2.MXXMLWriter
Set Handler = Writer
With Writer
.omitXMLDeclaration = False
.standalone = True
.disableOutputEscaping = False
.indent = False 'True = use vbNewLine and vbTab,
'False = no indenting.
' .encoding = "ascii"
' .encoding = "windows-1252"
.encoding = "utf-8"
' .encoding = "unicode"
.byteOrderMark = True 'Has no effect for 8-bit encodings.
End With
For I = 1 To NUM_DETAIL_ELEMS
If Not StreamIsOpen() Then
FileNum = FileNum + 1
StreamOpen "doc" & Format$(FileNum, "00") & ".xml"
Writer.output = Stream
With Handler
.startDocument
.startElement "", "", "document", Attributes
End With
End If
With Handler
If Not Writer.indent Then
'Use custom whitespace:
.ignorableWhitespace vbLf & Space$(4)
End If
With Attributes
.addAttribute "", "", "a", "", Hex$(Int(Rnd() * &H7FFFFFFF))
.addAttribute "", "", "b", "", Hex$(Int(Rnd() * &H7FFFFFFF))
.addAttribute "", "", "c", "", Hex$(Int(Rnd() * &H7FFFFFFF))
End With
.startElement "", "", "detail", Attributes
Attributes.Clear
.characters ChrW$(&HD8&) _
& Format$(DateAdd("n", _
Int(Rnd() * 10000000) - 5000000, _
Now()), _
"dddddd ttttt")
.endElement "", "", "detail"
End With
If I Mod CHECK_LIMIT_INTERVAL = 0 Then
Writer.flush
If StreamLength() >= FILE_LIMIT_BYTES Then GoSub CloseDocument
End If
Next
If StreamIsOpen() Then GoSub CloseDocument
lblStatus.Caption = "Done!"
Exit Sub
CloseDocument:
With Handler
If Not Writer.indent Then
.ignorableWhitespace vbLf
End If
.endElement "", "", "document"
.endDocument
End With
StreamClose
Return
End Sub