【问题标题】:WSO2 ESB/EI : How to get Original JSON body into XML PayloadWSO2 ESB/EI:如何将原始 JSON 正文转换为 XML 有效负载
【发布时间】:2020-02-24 10:13:43
【问题描述】:

我正在为该项目实施 WSO2 EI-6.4.0,我想将 JSON 转换为 XML。 当 HTML 标记包含在 JSON 响应中时,会出现以下问题。

例子:

输入:

{
  "departurePoint": "1: Galle, Sri Lanka<br />2: Hikkaduwa, Sri Lanka<br />3: Unawatuna, Sri Lanka<br />4: Ahangama, Sri Lanka<br />5: Midigama Beach, Sri Lanka<br />6: Weligama, Sri Lanka<br />7: Mirissa, Sri Lanka<br /><br>Traveler pickup is offered<br/>Free Pick up locations : Hikkaduwa , Galle ,Unawatuna , Ahangama , Midigama , Weligama , Mirissa<br><br>"
}

原始输出:

<departurePoint>
    1: Galle, Sri Lanka
    <br />2: Hikkaduwa, Sri Lanka
    <br />3: Unawatuna, Sri Lanka
    <br />4: Ahangama, Sri Lanka
    <br />5: Midigama Beach, Sri Lanka
    <br />6: Weligama, Sri Lanka
    <br />7: Mirissa, Sri Lanka
    <br />
    <br>Traveler pickup is offered
        <br/>Free Pick up locations : Hikkaduwa , Galle ,Unawatuna , Ahangama , Midigama , Weligama , Mirissa
        <br>
    <br>
</departurePoint>

预期输出:

<departurePoint>
    <![CDATA[1: Galle, Sri Lanka<br />2: Hikkaduwa, Sri Lanka<br />3: Unawatuna, Sri Lanka<br />4: Ahangama, Sri Lanka<br />5: Midigama Beach, Sri Lanka<br />6: Weligama, Sri Lanka<br />7: Mirissa, Sri Lanka<br /><br>Traveler pickup is offered<br/>Free Pick up locations : Hikkaduwa , Galle ,Unawatuna , Ahangama , Midigama , Weligama , Mirissa<br><br>]]>
</departurePoint>

我找不到为序列插入 CDATA 的方法。

【问题讨论】:

  • 您需要使用 XSLT 中介来添加 CDATA。请查看this
  • 我需要在 XSLT 映射阶段之前进行此更改。对于 XSLT,它带有上面提到的转换后的 XML,我用 java 脚本尝试过“原始输出”。但无法找到正确的处理方式。
  • 你检查了这个样本 [docs.wso2.com/display/EI6xx/…
  • 它不工作。 “找不到您尝试访问的页面。”

标签: wso2 wso2esb cdata wso2ei


【解决方案1】:

为了满足您的要求,您也可以使用 Payload factory 调解器。以下是实现您的要求的示例调解。此处将注册表资源与 CDATA 元素一起使用,以避免负载工厂调解器中的限制

代理配置

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="sampleProxy"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="http,https">
   <target>
      <inSequence>
         <call>
            <endpoint>
               <http uri-template="http://www.mocky.io/v2/5dbdc767330000678f16a289"/>
            </endpoint>
         </call>
         <log level="custom">
            <property expression="$body/jsonObject/departurePoint" name="test"/>
         </log>
         <payloadFactory media-type="xml">
            <format key="conf:/test/format.xml"/>
            <args>
               <arg evaluator="xml" expression="$body/jsonObject/departurePoint"/>
            </args>
         </payloadFactory>
         <respond/>
      </inSequence>
   </target>
   <description/>
</proxy>

注册表资源(format.xml)

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
     <departurePoint ><![CDATA[$1]]></departurePoint>
</soap:Body>

即使使用此配置,您也不会获得预期的输出。原因是 WSO2 EI 使用 STAX 解析器,默认情况下,STAX 解析器处于非合并模式。要更正此问题,您需要执行以下操作

  1. 在&lt;EI_HOME&gt;内创建一个名为 XMLInputFactory.properties 的文件

  2. 在文件中添加如下内容

javax.xml.stream.isCoalescing=false

【讨论】:

  • 加上javax.xml.stream.isCoalescing=false后,所有问题都解决了。无需添加 CDATA。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多