如何加快从磁盘加载 XML 文档的速度?

How can I speed up loading of XML documents from disk?

我正在尝试加速 VB6 XML 解析器。要解析的 XML 个文件存储在我的本地硬盘上。根据我的分析结果,下面的 If xDOC.Load(objFile.Path) Then 语句花费了很长时间。在处理一小批 100 XML 文件的过程中,该语句总共花费了 34.5 秒。示例 XML 文件是 here。是否可以改进此代码以加快 XML 文件加载速度,或者加载速度是否受 XML 文件本身的性质限制?

Option Explicit

Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object

Dim xDOC As MSXML2.DOMDocument

Dim xPE As MSXML2.IXMLDOMParseError

Sub Main()

Set xDOC = New DOMDocument

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objFSO.GetFolder("C:\My XML File Folder")

For Each objFile In objFolder.Files
    Set xDOC = New DOMDocument
    xDOC.async = False

    If xDOC.Load(objFile.Path) Then
        ' process the file
    Else
        ' XML file failed to load; log error and continue with next file
    End If

   Set xDOC = Nothing

Next objFile

Set objFolder = Nothing

End Sub

您的 XML 很好,实际上它很小,加载速度非常快,文档设置正确。

我注意到 DTD,每次下载文件时都会从 http://patents.ic.gc.ca/cipo/dtd/ca-patent-document-v2-0.dtd 重新下载。此外,DTD 本身还嵌入了其他 DTD 文件,因此您可能也会下载它们。

MSXML XML 默认会做很多额外的事情,但是如果你的 XML 已知是 "good",那么加载它的最快方法是在调用 Load() 之前将以下值设置为 false。这样你只验证 XML 格式正确。

var doc = new ActiveXObject("MSXML2.DOMDocument");
doc.validateOnParse = false;  // don't validate
doc.resolveExternals = false; // don't even download external files (DTDs...)
doc.preserveWhiteSpace = false; // don't try to preserve formatting.
doc.load("somexml.xml");

希望对你有所帮助,你可以用VB6翻译一下

运行 这与 windows

中的以下命令
cscript.exe testperf.js testfile.xml 1000

这是testperf.js

var aArguments = WScript.Arguments;
var xmlDoc;
var xslDoc;

function loadXMLFile( strFileName ) {
    var xml = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
    xml.setProperty("SelectionNamespaces", "xmlns:ms='urn:schemas-microsoft-com:xslt'");
    xml.validateOnParse = false;
    xml.resolveExternals = false;
    xml.preserveWhiteSpace = false;
    if( !xml.load( strFileName ) ) {
        var strError = "";
        var facility = xml.parseError.errorCode>>16 & 0x1FFF;
        var code = xml.parseError.errorCode & 0xFFFF;
        strError = 'Error loading: ' + strFileName + '\r\n';
        strError += xml.parseError.reason;
        strError += "Facility: " + facility + " Code: " + code + "\r\n";
        strError += xml.parseError.srcText + "\r\n";
        strError += xml.parseError.url + "\r\n";
        strError += "Line: " + xml.parseError.line +  " Postion: " + xml.parseError.linepos + "\r\n";
        throw new Error( xml.parseError.errorCode, strError );
    }
    return xml;
}

try {
    if( aArguments.length < 2 ) {
        WScript.Echo( "Usage: testperf file.xml loadcount" );
        WScript.Quit( 1 );
    }
    var strStatus = 'Loading XML';

    var dtStart = new Date().valueOf();
    var nLoop = parseInt( aArguments(1) );
    for( i = 0; i < nLoop; i++ ) {
        xmlDoc = loadXMLFile( aArguments(0) );
    }
    var dtStop = new Date().valueOf();
    WScript.Echo( nLoop + " XML loads took " + parseFloat( (dtStop - dtStart) / 1000 ).toFixed( 2 ) + " seconds.");

}
catch( e ) {
    WScript.Echo( 'Error in file:' + aArguments(1) + '\n' + e.number + " " + e.description );
    WScript.Quit( 1 );
}