【问题标题】:Conversion of XML to JsonXML到Json的转换
【发布时间】:2017-04-11 05:29:22
【问题描述】:

嗨,我有这样的 xml -

这是那个xml的节点-

<item col_sort='20160102' Month='Jan-2016' Week='Week 1' Date='01/02/2016' Name='A' Id='1'
                    Column1='0' Column1Agg1='1410.00' Column1Agg2='405.00' Column1Agg3='0'
                    Column2='38' Column2Agg1='2976' Column2Agg2='79' Column2Agg3='79'
                    Column3='0.32' Column3Agg1='0.56'  Column3Agg2='0.41' Column3Agg3='0.41' 
                    Column4='11.42' Column4Agg1='8.48'  Column4Agg2='9.55'  Column4Agg3='9.55'
                    Column5='8.76' Column5Agg1='2.97' Column5Agg2='9.81' Column5Agg3='9.81'
                    Column6='-1'  Column6Agg1='-2'  Column6Agg2='-1'  Column6Agg3='-1'
                    Column7='-99' Column7Agg1='99.9' Column7Agg2='-99' Column7Agg3='-99'
                    Column8='-99.00' Column8Agg1='8.00' Column8Agg2='-99.00' Column8Agg3='-99.00'
                    Column9='17.82' Column9Agg1='9.96' Column9Agg2='17.84' Column9Agg3='17.84' 
                    Column10='18.18' Column10Agg1='10.51' Column10Agg2='18.28' Column10Agg3='18.28'
                    Column11='-2' Column11Agg1='-2'  Column11Agg2='-2' Column11Agg3='-2'
                    Column12='7.9' Column12Agg1='44.6' Column12Agg2='7.6'  Column12Agg3='7.6'  
                    Column13='12.86' Column13Agg1='10.48' Column13Agg2='12.68' Column13Agg3='12.68' />

现在,这里的 Agg 是子节点的前缀。因此,在一个节点中,我们拥有父节点的所有子节点值。这里 Agg1 代表父母。 Agg2 是 Agg1 的孩子,Agg3 是 Agg2 的孩子。没有前缀的节点是叶子节点。

json = [ {
         "Month": "Dec-2016",
         "Column1Agg1": "1410.00",
         "Column2Agg1": "2976",
         "Column3Agg1": "0.56",
         "Column4Agg1": "8.48",,
         "Column5Agg1": "2.97",
         "Column6Agg1": "-2",
         "Column7Agg1": "-99.9",
         "Column8Agg1": "8.00",
         "Column9Agg1": "9.96",
         "Column10Agg1": "10.51",
         "Column11Agg1": "-2",
         "Column12Agg1": "44.6",
         "Column13Agg1": "10.48",
         "children" : [
         {"Week": "Week 1",
         "Column1Agg2": "405.00",
         "Column2Agg2": "79",
         "Column3Agg2": "0.41",
         "Column4Agg2": "9.55",
         "Column5Agg2": "9.81",
         "Column6Agg2": "-1",
         "Column7Agg2": "-99",
         "Column8Agg2": "-99.00",
         "Column9Agg2": "17.84",
         "Column10Agg2": "18.28",
         "Column11Agg2": "-2",
         "Column12Agg2": "7.6",
         "Column13Agg2": "12.68",
         "children" : [{
          "Date": "01/02/2016",
         "Column1Agg3": "405.00",
         "Column2Agg3": "79",
         "Column3Agg3": "0.41",
         "Column4Agg3": "9.55",
         "Column5Agg3": "9.81",
         "Column6Agg3": "-1",
         "Column7Agg3": "-99",
         "Column8Agg3": "-99.00",
         "Column9Agg3": "17.84",
         "Column10Agg3": "18.28",
         "Column11Agg3": "-2",
         "Column12Agg3": "7.6",
         "Column13Agg3": "12.68",
         "children" : [{
        "Name" : "A",
        "Id" : "1",
         "Column1": "0",
         "Column2": "38",
         "Column3": "0.32",
         "Column4": "11.42",
         "Column5": "8.76",
         "Column6": "-1",
         "Column7": "-99",
         "Column8": "-99.00",
         "Column9": "17.82",
         "Column10": "18.18",
         "Column11": "-2",
         "Column12": "7.9",
         "Column13": "12.86"

            }]
          }]
          }]
          }]

如何将这种类型的 xml 转换为带有子级的 json。

任何想法如何做到这一点

【问题讨论】:

  • 请同时添加一个问题。你已经描述了一些东西,你遇到了什么问题?
  • 打开谷歌并输入“javascript xml to json”并点击第一个链接。
  • @TahaPaksu 它不会创建子节点它只会转换...我想创建子节点
  • 你如何定义孩子?
  • 子节点或叶节点将没有前缀...父节点将具有前缀 Agg1,其子节点将具有前缀 Agg2 等等

标签: javascript json xml


【解决方案1】:

如果我这样做,我会首先将您疯狂的 XML 输入转换为更卫生的内容,如下所示:

<item col_sort='20160102' Month='Jan-2016' Week='Week 1' Date='01/02/2016' Name='A' Id='1'>
  <column nr='1' value='0'>
    <agg nr='1'>1410.00</agg>
    <agg nr='2'>405.00</agg>
    <agg nr='3'>0</agg>
  </column>
  <column nr='2' value='38'>
    <agg nr='1'>2976</agg>
    <agg nr='2'>79</agg>
    <agg nr='3'>79</agg>
  </column>
etc

使用 XSLT 很容易做到这一点。这是一个草图:

<xsl:for-each-group select="@*" group-by="f:colNr(name())">
  <xsl:sort select="number(current-grouping-key())"/>
  <column nr="{current-grouping-key()}">
    <xsl:for-each select="current-group()">
      <xsl:sort select="f:aggNr(name())">
        <agg nr="{f:aggNr(name())}">
         <xsl:value-of select="."/>

【讨论】:

    【解决方案2】:

    我用正则表达式对此进行了编码。如果需要,您可以添加一些额外的检查。

    var data = "<item col_sort='20160102' Month='Jan-2016' Week='Week 1' Date='01/02/2016' Name='A' Id='1' \
                        Column1='0' Column1Agg1='1410.00' Column1Agg2='405.00' Column1Agg3='0' \
                        Column2='38' Column2Agg1='2976' Column2Agg2='79' Column2Agg3='79' \
                        Column3='0.32' Column3Agg1='0.56'  Column3Agg2='0.41' Column3Agg3='0.41'  \
                        Column4='11.42' Column4Agg1='8.48'  Column4Agg2='9.55'  Column4Agg3='9.55'\
                        Column5='8.76' Column5Agg1='2.97' Column5Agg2='9.81' Column5Agg3='9.81'\
                        Column6='-1'  Column6Agg1='-2'  Column6Agg2='-1'  Column6Agg3='-1'\
                        Column7='-99' Column7Agg1='99.9' Column7Agg2='-99' Column7Agg3='-99'\
                        Column8='-99.00' Column8Agg1='8.00' Column8Agg2='-99.00' Column8Agg3='-99.00'\
                        Column9='17.82' Column9Agg1='9.96' Column9Agg2='17.84' Column9Agg3='17.84' \
                        Column10='18.18' Column10Agg1='10.51' Column10Agg2='18.28' Column10Agg3='18.28'\
                        Column11='-2' Column11Agg1='-2'  Column11Agg2='-2' Column11Agg3='-2'\
                        Column12='7.9' Column12Agg1='44.6' Column12Agg2='7.6'  Column12Agg3='7.6'  \
                        Column13='12.86' Column13Agg1='10.48' Column13Agg2='12.68' Column13Agg3='12.68' />";
    
        var getChildren = function(i, search){
    		var result = {};
    	    var re = new RegExp("Column([0-9]+)Agg"+i+"='([0-9.-]+)'", "g"), m, p = 0;			    
    		do {
    		    m = re.exec(search);		    		    
    		    if (m) {		    	
    		        result["Column" + m[1] + "Agg" + i] = m[2];
    		        p++;
    		    }
    		} while (m);			
      		if(p>0){
    			result.children = getChildren(i+1, search);
    		}
    		return result;
    	}
    
      var m;
    	var results = {};
    	
    	results = getChildren(1, data);	
    	results.Month = /Month='([^']+)'/g.exec(data)[1];
    	results.children.Week = /Week='([^']+)'/g.exec(data)[1];
    	results.children.children.Date = /Date='([^']+)'/g.exec(data)[1];
    	
    	console.log(results);
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 谢谢...但略有误解 Column1Agg1 是父节点,Column1 是叶节点,但我认为结果相反
    • 你能用你所说的来修正你的例子吗?我会修改我的答案。
    • 为什么你在每一行之前都加了'/'...现在我的回复怎么能做到呢?
    • 这个操作符是用来连接行的,只是我的测试数据。您需要将“数据”定义为您自己的输入。
    猜你喜欢
    • 2014-01-17
    • 2012-08-16
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2014-03-27
    相关资源
    最近更新 更多