(De) 使用 jackson xml 序列化混合内容?

Posted

技术标签:

【中文标题】(De) 使用 jackson xml 序列化混合内容?【英文标题】:(De)Serialize mixed content with jackson xml? 【发布时间】:2017-09-17 18:45:56 【问题描述】:

通过我所做的所有搜索,我了解到使用包含混合内容的 jackson 对 xml 进行序列化/反序列化是有问题的。有人知道使用 Java 处理以下 xml 的方法吗?

<xmlsample>
    <title>Yada yada yada <a href=\"component:tcm:757-228001\" id=\"Link_1492103133595\" title=\"yada\" name=\"Link_1492103133595\" xmlns=\"xhtml\">yada</a> yada</title>
    <link>test</link>
</xmlsample>

我正在使用以下 POJO:

@JacksonXmlRootElement(localName="xmlsample")
public class XmlSample

    private String title;
    private String link;

    public String getTitle() 
        return title;
    
    public void setTitle(String title) 
        this.title = title;
    
    public String getLink() 
        return link;
    
    public void setLink(String link) 
        this.link = link;
    

如果节点有混合内容,如上例,我会得到如下错误:

java.io.IOException: Expected END_ELEMENT, got event of type 1

如果节点有纯文本,则反序列化有效。

我已经尝试使用 JsonNode、TextNode、ObjectNode、Object 而不是 String 作为数据类型。我尝试了自定义序列化器和反序列化器,但错误仍然存​​在。事实上,如果节点中有html,处理不会到达自定义反序列化器。

此 xml 来自我无法更改的第 3 方系统 (SDL Tridion)。

任何帮助将不胜感激!

编辑:我需要澄清该节点可以包含标记或可以包含纯文本,因此我无法创建代表您在上面的 xml 中看到的标记的 POJO。并且其中的标记也可能比上面的示例复杂得多。这就是为什么我只是试图将它强制转换为字符串。我不需要对其进行操作,只需将其保存在 POJO 中即可原样返回到数据库中。

【问题讨论】:

您找到解决问题的方法了吗?我们正在处理同样的问题并尝试了您提到的所有选项,但仍然无法正常工作。我正在考虑转移到 jaxb 进行反序列化,因为 jackson 似乎并没有涵盖所有未出现在 json 中的情况(属性/具有相同名称的多个连续节点)。 还没有找到解决办法。 jackson github 中的错误报告对此有未解决的问题,但没有解决方案。 【参考方案1】:

您可以尝试使用 CDATA:

<![CDATA[<]]>
<![CDATA[>]]>

或其他解决方法,例如转义括号,所以“&lt;”等等......

【讨论】:

以上是关于(De) 使用 jackson xml 序列化混合内容?的主要内容,如果未能解决你的问题,请参考以下文章

Jackson 序列化:XML 和 JSON 的不同格式

Rest easy 3 + Jackson + Tomcat + XML 响应

使用 Jackson 来(反)序列化 Scala 案例类

jackson xml 列出了被识别为重复键的反序列化

Jackson 反序列化同名的 xml 字段

Jackson 序列化:将字段值设置为 XML 元素名称