如果使用freemarker在源中不存在元素,则从上一行省略逗号

时间:2019-05-17 20:08:53

标签: json xml freemarker

我正在使用freemarker将xml转换为json。我的Xml正在关注

<ResponseMetadata> 
   <ResponseCode>HS000000</ResponseCode> 
   <ResponseDescriptionText>Success</ResponseDescriptionText> 
</ResponseMetadata>

我正在使用以下ftl进行转换。

<#assign data =  xml['child::node()']>
{      
  "ResponseMetadata":{  
     <#if (data.ResponseCode)?has_content>"ResponseCode":"${data.ResponseCode}",</#if>
     <#if (data.ResponseDescriptionText)?has_content>"ResponseDescriptionText":"${data.ResponseDescriptionText}",</#if>
     <#if (data.TDSResponseDescriptionText)?has_content>,"TDSResponseDescriptionText":"${data.TDSResponseDescriptionText}" </#if>   
  }
}

由于在XML源中不存在第三个元素,因此我得到了以下输出,其中第二个元素之后打印了逗号(,)。

"ResponseMetadata":{  
     "ResponseCode":"HS000000",
     "ResponseDescriptionText":"Success" ,   
  }
}

如果未找到如下元素,我希望输出不带逗号:

"ResponseMetadata":{  
     "ResponseCode":"HS000000",
     "ResponseDescriptionText":"Success"   
  }
}

我的问题是当源xml中不存在下一个元素时,如何省略逗号。谢谢

2 个答案:

答案 0 :(得分:1)

如果只想将XML更改为JSON,则可以简化代码,列出xml中的所有节点并使用let newDiv = document.createElement("DIV"); newDiv.setAttribute("id", "hide"); document.body.appendChild(newDiv); document.getElementById("hide").style.zIndex = "9"; document.getElementById("hide").style.width = "100%"; document.getElementById("hide").style.height = "100%"; document.getElementById("hide").style.backgroundImage = "url('https://s3.amazonaws.com/cdn-origin-etr.akc.org/wp-content/uploads/2018/05/22224952/beagle-puppy-in-large-cushion-chair.jpg')"; document.getElementById("hide").style.backgroundRepeat = "no-repeat"; document.getElementById("hide").style.backgroundSize = "cover"; document.getElementById("hide").style.top = "0"; document.getElementById("hide").style.position = "fixed"; document.body.style.margin = "0"; document.body.style.padding = "0";

sep

结果:

<#assign data =  xml['child::node()']/>
{      
    "ResponseMetadata":{  
    <#list data?children as field>
        "${field?node_name}":"${field}"<#sep>,</#sep>
    </#list>
    }
}

寻找XML here的更多freemarker内置函数

答案 1 :(得分:0)

最后,我能够解决这个问题。解决方案是声明一个序列并添加具有内容并解析为列表的元素。解决方案代码如下

<#assign data =  xml['child::node()']>

    {      
      "ResponseMetadata":{  
      <#assign y = []>
         <#if (data.ResponseCode)?has_content>
                <#assign var1>"ResponseCode":"${data.ResponseCode}"</#assign>
                <#assign y = y + [ var1 ] />
         </#if>
         <#if (data.ResponseDescriptionText)?has_content>
             <#assign var2>"ResponseDescriptionText":"${data.ResponseDescriptionText}"</#assign>
             <#assign y = y + [ var2 ] />
         </#if>
         <#if (data.TDSResponseDescriptionText)?has_content>
             <#assign var3>"TDSResponseDescriptionText":"${data.TDSResponseDescriptionText}" </#assign>
             <#assign y = y + [ var3 ] />
         </#if>   

        <#list y as x>
            ${x}<#sep>,</#sep>
        </#list>

      }
    }