Stack Overflow 上有一些类似的主题,但我找不到任何真正解释如何做到这一点的主题。
我有一个 API,它以 XML
形式返回数据。我想将其转换为 JSON
,因为我将其存储在 MongoDB
中。
<cj-api>
<products total-matched="231746" records-returned="999" page-number="1">
<product>
<ad-id>10648829</ad-id>
<advertiser-id>2618386</advertiser-id>
<advertiser-name>Acne Jeans UK</advertiser-name>
<advertiser-category>New Arrivals</advertiser-category>
<buy-url>http://www.tkqlhce.com/click-7227532-10648829?url=http%3A%2F%2Fshop.acnestudios.com%2Fpop-cord-white.html&cjsku=30X133-151</buy-url>
<catalog-id>cjo:939</catalog-id>
<currency>EUR</currency>
<description>Pop Cord White.</description>
<image-url>http://c893323.r23.cf3.rackcdn.com/catalog/product/cache/25/thumbnail/300x300/9df78eab33525d08d6e5fb8d27136e95/3/0/30X133-151_A_57419.jpg</image-url>
<in-stock>true</in-stock>
<isbn/>
<manufacturer-name>Acne Studios</manufacturer-name>
<manufacturer-sku/>
<name>Pop Cord White</name>
<price>200.0</price>
<retail-price/>
<sale-price/>
<sku>30X133-151</sku>
<upc/>
</product>
<product>
<ad-id>10648829</ad-id>
<advertiser-id>2618386</advertiser-id>
<advertiser-name>Acne Jeans UK</advertiser-name>
<advertiser-category>Jeans</advertiser-category>
<buy-url>http://www.dpbolvw.net/click-7227532-10648829?url=http%3A%2F%2Fshop.acnestudios.com%2Fflex-black.html&cjsku=30H126-129</buy-url>
<catalog-id>cjo:939</catalog-id>
<currency>EUR</currency>
<description>Acne Flex Black jeans are narrow, tight fitting jeans with a comfortable mid rise waist.<ul>
<li>Worn in black blue wash</li>
<li>Classic five pocket styling</li>
<li>Zippered fly front closure</li>
<li>Secures at the waist with bachelor button</li>
<li>Acne embossed rivets</li>
</ul>.</description>
<image-url>http://c893323.r23.cf3.rackcdn.com/catalog/product/cache/25/thumbnail/300x300/9df78eab33525d08d6e5fb8d27136e95/3/0/30H126-129_A_18.jpg</image-url>
<in-stock>true</in-stock>
<isbn/>
<manufacturer-name>Acne Studios</manufacturer-name>
<manufacturer-sku/>
<name>Flex Black</name>
<price>170.0</price>
<retail-price/>
<sale-price/>
<sku>30H126-129</sku>
<upc/>
</product>
</products>
</cj-api>
(假设只有 2 种产品 - 实际上有 231,746 种!)
在 Node 中,我使用 request
收集此 XML 并将其存储在名为 body
的变量中。我正在使用 libxmljs
,如下所示:
var xmlDoc = libxmljs.parseXmlString(body);
var product = xmlDoc.get('//product'); <!-- very unsure whether I'm using this correctly
问题是我完全不知道如何处理这些数据,而 libxmljs docs在这方面确实无济于事。我想做一些类似于 jQuery 的事情:
$('product').each(function(){
var obj = {
advertiser-name: $(this).find('advertiser-name'),
buy-url: $(this).find('buy-url'),
... etc etc etc
})
如何使用 libxmljs
/另一个库来做到这一点,以便我可以更轻松地处理数据?
最佳答案
关于使用libxmljs
:
您需要使用
xmlDoc.find('//product')
而不是get
,因为get
仅首先返回特定 XPath 的元素(//product
是 XPath )。您可以在wiki上找到文档对象的所有其他方法。方法
find
返回 elements 的数组,因此相当于您的 jQuery 示例:var xmlDoc = libxmljs.parseXmlString(xml); var products = xmlDoc.find('//product'); for (var index = 0; index < products.length; index++) { var obj = { "advertiser-name": products[index].get('advertiser-name').text() }; // ... }
在此示例中,对于每个元素,我使用方法
get
(因为我知道只有一个子元素具有此名称)来获取子元素,然后仅询问text
值这个元素的。
其次我想向您推荐 xml2js
模块( github ),它可以将 xml 转换为 JSON 对象。为此,您只需使用带有两个参数 xml
字符串和回调 function (err, result) { ... }
的 parseString
函数,其中结果将是此 xml 的 JSON 表示形式。
因为您还提到每个 xml 可以有 > 200,000 个产品 - 您需要了解这些库的性能。在我看来,它们都会将整个 XML 加载到内存中。如果您只需要执行此脚本一次,或者每天(或每小时)执行一次 - 我想按原样使用它就可以了。如果您需要提高性能,您应该看看 SaxPushParser来自 libxmljs
库的接口(interface)。
关于javascript - 在 Node JS 中将 XML 转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18246926/