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

dor*_*emi 3 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>
Run Code Online (Sandbox Code Playgroud)

我正在使用它来获取每本书的名称:

var books = this.req.responseXML.getElementsByTagName("books")[0].getElementsByTagName("bookinfo")
Run Code Online (Sandbox Code Playgroud)

然后使用for循环对每个书名做一些事情:

var bookName = books[i].getElementsByTagName("name")[0].firstChild.nodeValue;
Run Code Online (Sandbox Code Playgroud)

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

有更快的方法吗?

Rob*_*obG 5

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

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

Mozilla文档

MSDN文档

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

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


Ami*_*pta 5

您可以尝试使用快速 xml 解析器将 XML 数据转换为 JS 中实现的 JSON。这是针对其他解析器的基准测试

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

// when a tag has attributes
var options = {
        attrPrefix : "@_"        };
var jsonObj = parser.parse(xmlData,options);
Run Code Online (Sandbox Code Playgroud)

如果不想使用 npm 库,可以直接在 HTML 中包含parser.js

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

  • 不幸的是,截至 2021 年,该库仍然无法保留节点中元素的顺序。它将任何同名节点合并到一个数组中,而不考虑这些节点的顺序。 (2认同)