2011-02-28 40 views
3

假設我有大約1000多個bookinfo節點的XML。在JS中解析這個XML的最快方法

<results> 
    <books> 
    <bookinfo> 
     <name>1</dbname> 
    </bookinfo> 
    <bookinfo> 
    <name>2</dbname> 
    </bookinfo> 
    <bookinfo> 
    <name>3</dbname> 
    </bookinfo> 
</books> 
</results> 
我目前使用它來獲取每本書的名字

var books = this.req.responseXML.getElementsByTagName("books")[0].getElementsByTagName("bookinfo") 

然後用一個for循環做一些與每本書的名字:

var bookName = books[i].getElementsByTagName("name")[0].firstChild.nodeValue; 

我當書籍真的很大時,我覺得這很慢。不幸的是,沒有辦法限制結果集,也不能指定不同的返回類型。

有沒有更快的方法?

+0

您可以將'getElementsByTagName'調用存儲爲一個變量/數組,因此它只被調用一次。 – 2011-02-28 04:13:42

+0

100個XML節點是**沒有**。一次顯示你如何爲一本以上的書做這件事。 – 2011-02-28 04:16:00

+0

它實際上更像1000+,並且比我在示例XML輸出中呈現的數據多得多。 – doremi 2011-02-28 04:16:47

回答

5

推測您使用的是XMLHttpRequest,在這種情況下,在調用任何responseXML方法(即XML已經被解析並轉換爲DOM)之前,XML會被解析。如果你想要一個更快的解析器,你可能需要一個不同的用戶代理或者一個不同的JavaScript引擎來處理你當前的UA。

如果您要訪問的XML文檔中的內容更快的方法,考慮的XPath:

Mozilla documentation

MSDN documentation

我使用XPath表達式(如//parentNode/node/text())在134KB本地文件提取439個元素的文本節點,將它們放到一個數組中(因爲這是我的標準evalXPath()函數所做的),然後迭代該數組以將每個文本節點的nodeValue放入另一個數組中,使用正則表達式對兩個替換調用進行格式化文字,然後alert()即到屏幕join('\n')。它花了3ms。

具有529個節點的487KB文件花費4ms(IE 6報告15ms,但其時鐘分辨率非常差)。當然,我的網絡延遲幾乎爲零,但它表明XML解析器,XPath評估器和腳本通常可以快速處理該大小的文件。

0

您可以嘗試fast xml parser將XML數據轉換爲JS中實現並基於正則表達式的JSON。這是benchmark針對其他解析器。

var fastXmlParser = require('fast-xml-parser'); 
var jsonObj = fastXmlParser.parse(xmlData); 

// when a tag has attributes 
var options = { 
     attrPrefix : "@_", 
     textNodeName : "#text", 
     ignoreNonTextNodeAttr : true, 
     ignoreTextNodeAttr : true, 
     ignoreNameSpace : true 
    }; 
var jsonObj = fastXmlParser.parse(xmlData,options); 

//Intermediate obj 
var tObj = fastXmlParser.getTraversalObj(xmlData,options); 
var jsonObj = fastXmlParser.convertToJson(tObj); 

如果你不想使用NPM庫,你可以在HTML parser.js直接。