Опущение запятой из предыдущей строки, если элемент отсутствует в источнике с помощью freemarker - PullRequest
0 голосов
/ 17 мая 2019

Я делаю преобразование xml в json, используя freemarker.Мой 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 ]

1 голос
/ 18 мая 2019

Если вы хотите изменить только XML на JSON, вы можете упростить код, составить список всех узлов в XML и использовать sep:

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

И результат:

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

Ищите больше встроенных функций freemarker для XML здесь

0 голосов
/ 21 мая 2019

Наконец-то я смог решить эту проблему.Решением было бы объявить последовательность и добавить элемент с содержимым и разобрать его в виде списка.Код решения следующий

<#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>

      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...