Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点JS中将XML转换为JSON_Javascript_Xml_Json_Node.js_Mongodb - Fatal编程技术网

Javascript 在节点JS中将XML转换为JSON

Javascript 在节点JS中将XML转换为JSON,javascript,xml,json,node.js,mongodb,Javascript,Xml,Json,Node.js,Mongodb,有一些关于堆栈溢出的类似主题,但我找不到任何真正解释如何实现它的主题 我有一个API,它以XML的形式返回数据。我想将其转换为JSON,因为我将其存储在MongoDB中 <cj-api> <products total-matched="231746" records-returned="999" page-number="1"> <product> <ad-id>10648829</ad-id

有一些关于堆栈溢出的类似主题,但我找不到任何真正解释如何实现它的主题

我有一个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>
问题是,我完全不知道如何处理这些数据,而这些数据在这方面真的毫无帮助。我想做一些与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
    是一个值)。您可以在上找到文档对象的所有其他方法

  • 方法
    find
    返回的数组,因此与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()
      };
    
      // ...
    }
    
    var xmlDoc=libxmljs.parseXmlString(xml);
    var products=xmlDoc.find('//product');
    对于(var指数=0;指数
    在本例中,对于每个元素,我使用方法
    get
    (因为我知道只有一个子元素有这个名称)来获取子元素,然后只需询问该元素的
    text

第二,我推荐您使用
xml2js
module(),它可以将xml转换为JSON对象。为此,您只需要使用带有两个参数的
parseString
函数
xml
字符串和回调
函数(err,result){…}
,其中结果将是此xml的JSON表示


因为您还提到每个xml可以有>200000个产品,所以您需要了解这些库的性能。在我看来,它们都将在内存中加载整个XML。如果您只需要执行这个脚本一次,或者一天(或一小时)执行一次,我想可以按原样使用它。如果您需要提高性能,您应该查看
libxmljs
库中的界面。

关于使用
libxmljs

  • 您需要使用
    xmlDoc.find('//product')
    而不是
    get
    ,因为
    get
    只返回特定XPath的第一个元素(
    //product
    是一个值)。您可以在上找到文档对象的所有其他方法

  • 方法
    find
    返回的数组,因此与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()
      };
    
      // ...
    }
    
    var xmlDoc=libxmljs.parseXmlString(xml);
    var products=xmlDoc.find('//product');
    对于(var指数=0;指数
    在本例中,对于每个元素,我使用方法
    get
    (因为我知道只有一个子元素有这个名称)来获取子元素,然后只需询问该元素的
    text

第二,我推荐您使用
xml2js
module(),它可以将xml转换为JSON对象。为此,您只需要使用带有两个参数的
parseString
函数
xml
字符串和回调
函数(err,result){…}
,其中结果将是此xml的JSON表示

因为您还提到每个xml可以有>200000个产品,所以您需要了解这些库的性能。在我看来,它们都将在内存中加载整个XML。如果您只需要执行这个脚本一次,或者一天(或一小时)执行一次,我想可以按原样使用它。如果您需要提高性能,您应该查看
libxmljs
库中的接口