在JS中解析此XML的最快方法

时间:2011-02-28 04:10:42

标签: javascript xml performance

假设我拥有大约1000多个bookinfo节点的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;

当书本真的很大时,我发现这真的很慢。不幸的是,没有办法限制结果集,也没有指定不同的返回类型。

有更快的方法吗?

3 个答案:

答案 0 :(得分:5)

大概你正在使用XMLHttpRequest,在这种情况下,在调用responseXML的任何方法之前解析XML(即XML已经被解析并变成了DOM)。如果您想要更快的解析器,您可能需要为当前的UA使用不同的用户代理或不同的JavaScript引擎。

如果您想以更快的方式访问XML文档中的内容,请考虑使用XPath:

Mozilla documentation

MSDN documentation

我在一个134KB的本地文件中使用了一个XPath表达式(如//parentNode/node/text())来提取439个元素的文本节点,将它们放入一个数组中(因为那是我的标准evalXPath()函数所做的),然后遍历该数组,将每个文本节点的nodeValue放入另一个数组,用正则表达式替换两个调用来格式化文本,然后alert()join('\n')屏幕。花了3毫秒。

487KB文件,529个节点需要4ms(IE 6报告为15ms,但其时钟分辨率非常低)。当然,我的网络延迟几乎为零,但它表明XML解析器,XPath评估程序和脚本通常可以快速处理该大小文件。

答案 1 :(得分:1)

如果您想更快地解析该xml中的信息,请尝试使用txml。它非常易于使用,对于所显示的xml类型,可以使用其simple方法。它将为您提供非常干净的对象供您使用。

https://www.npmjs.com/package/txml

免责声明:我是该库的作者。

答案 2 :(得分:0)

您可以尝试fast xml parser将XML数据转换为JSON,这是在JS中实现的,并且仅基于正则表达式。这是针对其他解析器的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