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

Javascript 在JS中解析此XML的最快方法,javascript,xml,performance,Javascript,Xml,Performance,假设我有大约1000多个bookinfo节点的XML <results> <books> <bookinfo> <name>1</dbname> </bookinfo> <bookinfo> <name>2</dbname> </bookinfo> <bookinfo> <name>3

假设我有大约1000多个bookinfo节点的XML

<results>
  <books>
   <bookinfo>
        <name>1</dbname>
   </bookinfo>
   <bookinfo>
     <name>2</dbname>
   </bookinfo>
   <bookinfo>
     <name>3</dbname>
   </bookinfo>
 </books>
</results>
然后使用for循环对每个图书名称执行以下操作:

var bookName = books[i].getElementsByTagName("name")[0].firstChild.nodeValue;
我发现当书真的很大的时候,这真的很慢。不幸的是,无法限制结果集,也无法指定不同的返回类型


有没有更快的方法?

假设您使用的是XMLHttpRequest,在这种情况下,在调用responseXML的任何方法之前解析XML(即XML已经被解析并转换为DOM)。如果你想要一个更快的解析器,你可能需要一个不同的用户代理或者一个不同的javascript引擎来支持你当前的UA

如果您想更快地访问XML文档中的内容,请考虑XPath:

我在一个134KB的本地文件上使用了一个XPath表达式(比如
//parentNode/node/text()
)来提取439个元素的文本节点,将它们放入一个数组中(因为这是我的标准
evalXPath()
函数所做的),然后迭代该数组,将每个文本节点的nodeValue放入另一个数组中,使用正则表达式执行两个replace调用以格式化文本,然后使用
join('\n')
将其发送到屏幕。花了3毫秒

一个包含529个节点的487KB文件需要4ms(即6个报告需要15ms,但其时钟分辨率非常差)。当然,我的网络延迟几乎为零,但这表明XML解析器、XPath计算器和脚本通常可以快速处理该大小的文件。

您可以尝试将XML数据转换为JSON,JSON在JS中实现。下面是与另一个解析器的比较

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);
如果您不想使用npm库,可以直接在HTML中包含


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

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


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

您可以将
getElementsByTagName
调用存储为变量/数组,以便只调用一次。100个XML节点算不了什么。展示你如何一次完成多本书的解析。你确定是解析速度慢吗?您正在使用JavaScript探查器吗?您如何确定它不是由大型XML文件引起的,比如将其传输到浏览器?@Joshua我认为@Matt是对的-您应该在具有探查器功能的浏览器中运行应用程序。是否有机会在服务器中将该XML转换为JSON?您将保存传输的字节和CPU时间HI Tobias。您应该在回答中解释您是txml库的作者。不幸的是,截至2021年,该库仍然没有保留节点中元素的顺序。它将任何同名节点合并到一个数组中,而不考虑这些节点的顺序。
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);