在JavaScript中有效地解析许多XML消息的非常大的文件

时间:2014-01-15 15:48:36

标签: javascript xml performance optimization large-files

我正在处理一组DAT文件,每个文件的大小约为250,000 KB。 里面有许多XML消息,每个消息都很小并且在一行上。

这些是飞机移动信息。我正在寻找EstimatedTimetoDepart更改。

我需要搜索具有某个节点的XML消息,提取此值以及帮助我​​关联消息的某些先前节点的值。

因此,我提取节点“EstimatedDepartureDateTime”的值以及运营商代码,出发机场的先前节点......等等。

我得到的代码有效。它打开文件,读取一行,将此行转换为XML对象。在此XML中搜索节点。如果找到则提取其他数据并写入数组以写入CSV文件。

问题是它很慢。也许10分钟。我不知道我能做些什么来加快速度。 它不需要是JavaScript。它正是我可以轻松地在工作机器上敲出来的,我还不知道其他脚本语言。

要求提高速度的建议。对不起,如果这篇文章不符合惯例。

function StringtoXML(text)
{
    if (window.ActiveXObject) // testing for older IE 
    {
        var doc=new ActiveXObject('Microsoft.XMLDOM');
        doc.async='false';
        doc.loadXML(text);
    } 
    else  // all other browsers
    {
        var parser=new DOMParser();
        var doc=parser.parseFromString(text,'text/xml');
    }
    return doc;
}

function addToCSVFile(csvFile, outputLocation) 
{                

    var fso = new ActiveXObject('Scripting.FileSystemObject');
    var oStream = fso.OpenTextFile(outputLocation, 8, true, 0);
    oStream.WriteLine(csvFile.join(','));
    oStream.Close();
}



function readXML(singleXmlDoc, nodeSearchString)
{

CsvData = new Array();

var i = 0;
try
    {
    //alert("getElementsByTagName" + singleXmlDoc.getElementsByTagName("EstimatedDepartureDateTime")[0].text);  
    //var aReturn = singleXmlDoc.getElementsByTagName("EstimatedDepartureDateTime")[0].text
    var aReturn = singleXmlDoc.getElementsByTagName(nodeSearchString)[0].text; 
    if (aReturn != null ) 
        {
            //Carrier code
            CsvData[i] = singleXmlDoc.documentElement.childNodes[1].firstChild.text;
            i++;

            //Flight Number
            CsvData[i] = singleXmlDoc.documentElement.childNodes[1].childNodes(1).text;
            i++;

            //OperationalSuffix
            CsvData[i] = singleXmlDoc.documentElement.childNodes[1].childNodes(2).text;
            i++;

            //DepartureAirportCode
            CsvData[i] = singleXmlDoc.documentElement.childNodes[1].childNodes(3).text;
            i++;

            //FlightOriginDate
            CsvData[i] = singleXmlDoc.documentElement.childNodes[1].childNodes(4).text;
            i++;

            //ArrivalAirportCode
            CsvData[i] = singleXmlDoc.documentElement.childNodes[2].childNodes(0).text;
            i++;

            CsvData[i] = aReturn;
            i = 0;
            //array holds 6 elements per XML match

        }
        return CsvData;
    }
catch(e)
    {
    //this catch will fill for every non match
    }
    //end of Try    
}


function extractFileLine()
{
try
    {
        var  cosiLocation = document.getElementById('cosiLocation').value;
        var  outputLocation = document.getElementById('outputLocation').value;  
        var  searchNodeText = document.getElementById('searchNodeText').value;
        var  locationArray = [];

        if (cosiLocation.indexOf(',') != -1)
        {
            locationArray = cosiLocation.split(',');
        }
        else
        {
            locationArray[0] = cosiLocation;
        }

        //loop here to open a new file.  
        for (var i=0; i < locationArray.length; i++) 
        {
            var ForReading = 1;
            var fso = new ActiveXObject("Scripting.FileSystemObject");  
            var fileObj = fso.GetFile(locationArray[i]);
            var ts = fileObj.OpenAsTextStream(ForReading, 0 );
            var loc = outputLocation + searchNodeText + ".csv";

            while(!ts.AtEndOfStream) 
            {
                var textLine = ts.ReadLine();
                var xmlDoc = StringtoXML(textLine);
                var csvArray = readXML(xmlDoc, searchNodeText);
                if (csvArray)   
                {
                    addToCSVFile(csvArray, loc);
                    //alert("Line inserted");
                }

            }
            ts.Close();
            //clearData();
        }   

        alert("Done");
    }
    catch(e)
    {
    alert('An error has occurred '+e.message);
    }
}

0 个答案:

没有答案