假设我拥有大约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;
当书本真的很大时,我发现这真的很慢。不幸的是,没有办法限制结果集,也没有指定不同的返回类型。
有更快的方法吗?
答案 0 :(得分:5)
大概你正在使用XMLHttpRequest,在这种情况下,在调用responseXML的任何方法之前解析XML(即XML已经被解析并变成了DOM)。如果您想要更快的解析器,您可能需要为当前的UA使用不同的用户代理或不同的JavaScript引擎。
如果您想以更快的方式访问XML文档中的内容,请考虑使用XPath:
我在一个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。