【问题标题】:How to parse a XML converted to JSON如何解析转换为 JSON 的 XML
【发布时间】:2012-10-15 20:24:49
【问题描述】:

我从 WebService 获得了一个 xml 文件

<MasterProducts> <MasterProduct> <Productcode>023DDC</Productcode> <Description>Dell CRT 17 Computer Monitor E771a</Description> <ThumbPic>NoImage.png</ThumbPic> <RRP>0.000000</RRP> <Stock>2</Stock> </MasterProduct> </MasterProducts>

我使用的 Chrome IDE 会自动将其转换为 JSON,我一直在尝试解析它但没有成功,因为我对 Javascript 还很陌生。

httpResponse 返回一个错误变量和一个保存 json 文件的数据变量。

if(error===false)
{ 
    if(data !== '')
    { 
        objData = data.getElementsByTagName('MasterProducts');
        //returns a NodeList here
        var items = objData[0].getElementsByTagName('MasterProduct')[0].getElementsByTagName('Description')[0].firstChild.data;

    }
    else
    { 
        alert("No Data"); 
    } 
}

我只获取了节点列表,但我无法从标签中获取我需要的数据。

编辑: 使用在线转换器,我得到了下面的 JSON

{
   "MasterProducts": {
      "MasterProduct": {
  "Productcode": "023DDC",
  "Description": "Dell CRT 17 Computer Monitor E771a",
  "ThumbPic": "NoImage.png",
  "RRP": "0.000000",
  "Stock": "2"
      }
  }
 }

【问题讨论】:

  • 您可以添加 JSON 或至少一个类似的示例吗?
  • 使用 json 时不需要使用 getElementsByTagName。只需使用点符号直接访问数据,即... var items = data.MasterProducts.MasterProduct.whatever.whatever
  • 当我有几组结果需要填充数组时会发生什么

标签: jquery xml json xml-parsing nodelist


【解决方案1】:

根据http://jsonlint.com/,您返回的 JSON 是有效的,因此您的脚本应该能够使用点符号访问数据的内容,而不是像 XML 那样解析节点

var data ={
            "MasterProducts": {
                "MasterProduct": {   
                    "Productcode": "023DDC",
                    "Description": "Dell CRT 17 Computer Monitor E771a",
                    "ThumbPic": "NoImage.png",
                    "RRP": "0.000000",
                    "Stock": "2"
                 }   
             }  
         }

 var description = data.MasterProducts.MasterProduct.Description;

描述将包含“Dell CRT 17 Computer Monitor E771a”

【讨论】:

    【解决方案2】:

    数据似乎是一种字符串。 “getElementsByTagName”仅在 dom 元素和 dom 本身上可用(在某些浏览器中)。尝试将您的响应添加到隐藏的 div 并使用 jQuery 进行查询。

    $("#hidden").html(data);
    

    然后使用 jquery 查询该 div,或者您可以直接使用 dom,就像您尝试做的那样。

    $("#hidden").find("MasterProducts")[0].getElementsByTagName("MasterProduct")
    

    【讨论】:

    • 这应该在 chrome 中工作。你想让我做一个小提琴吗?
    • 是的,这将非常有帮助
    【解决方案3】:

    您可以将 xml 直接存储在 jQuery obj 中,而无需将其添加到 dom 中,就像其他答案所说的那样。

    var $xml = $(data);
    

    然后简单地使用 jQuery 来定位特定元素,避免使用 getElementsByTagName,因为它仅在某些浏览器中可用。

    var MasterProducts = [];
    
    $xml.find('MasterProduct').each(function(){
       var $masterProduct = $(this);
       var masterProduct = {};
       $masterProduct.find('*').each(function(){
          masterProduct[$(this).get(0).tagName] = $(this).text();
       });
       MasterProducts.push(masterProduct);
    });
    

    最后,您的 MasterProducts 数组应该包含一个 JavaScript 对象,然后您可以通过以下调用将其转换为 JSON。

    var json = JSON.stringify(MasterProducts);
    

    我把它放在 jsFiddle 上。见http://jsfiddle.net/WRF4D/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      相关资源
      最近更新 更多