【问题标题】:Is it possible to limit the file size of an XML in MSXML with VB6?是否可以使用 VB6 限制 MSXML 中 XML 的文件大小?
【发布时间】:2017-02-28 21:42:47
【问题描述】:

我有可能在使用 MSXML 在 Vb6 中创建 XML 时限制其大小吗?

例如,我必须创建一个类似 2GB 的 XML 文件,但我希望将其拆分为 4 个 500MB 的文件或 2 个 1GB 的文件。

请告诉我解决这个问题的正确方向。

谢谢。

【问题讨论】:

  • 在一个 32 位程序中,你可能会很早就耗尽内存来为这么多数据保存一个臃肿的 DOM。如果您真的想创建如此庞大的 XML 文档,请跳过 DOM 并使用 SAX 或 ad hoc 逻辑。

标签: xml vb6 msxml msxml6 msxml4


【解决方案1】:

此代码使用 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

【讨论】:

    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2010-10-06
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多