【问题标题】:Converting XML to JSON in Node JS在 Node JS 中将 XML 转换为 JSON
【发布时间】:2013-08-17 07:15:30
【问题描述】:

Stack Overflow 上有一些类似的主题,但我找不到任何真正解释如何做到这一点的主题。

我有一个以XML 形式返回数据的 API。我想将其转换为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 / 另一个库来做到这一点,以便我可以更轻松地处理数据?

【问题讨论】:

    标签: javascript xml json node.js mongodb


    【解决方案1】:

    关于使用libxmljs

    • 您需要使用xmlDoc.find('//product') 而不是get,因为get 只返回特定XPath 的第一个元素(//productXPath)。您可以在 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 加载到内存中。如果您只需要执行此脚本一次,或者可能每天(或每小时)执行一次 - 我想按原样使用它就可以了。如果您需要提高性能,您应该查看来自libxmljs 库的SaxPushParser 接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      相关资源
      最近更新 更多