使用动态字段反序列化嵌套的XML

时间:2019-12-06 15:33:20

标签: java jaxb liferay xml-serialization jackson-dataformat-xml

我有以下XML数据,它们是由liferay-Portal 6.2为期刊文章生成的:

<root available-locales="de_DE" default-locale="de_DE">
<dynamic-element name="Begriff" index="0" type="text" index-type="keyword">
    <dynamic-content language-id="de_DE"><![CDATA[Transition]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Abkürzung" index="0" type="text" index-type="keyword">
    <dynamic-content language-id="de_DE"><![CDATA[]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Synonyme" index="0" type="text" index-type="keyword">
    <dynamic-content language-id="de_DE"><![CDATA[]]></dynamic-content>
</dynamic-element>
<dynamic-element name="Text" index="0" type="text_area" index-type="keyword">
    <dynamic-content language-id="de_DE"><![CDATA[<p>...</p>
<p>Beispielsweise wird d...</p>]]></dynamic-content>
    </dynamic-element>
</root>

如何使用Jackson注释从该XML获取POJO

我从以下内容开始:

@XmlRootElement
@JsonIgnoreProperties(ignoreUnknown=true)
public class BlogEntryContent implements Serializable {

@JacksonXmlElementWrapper(localName = "dynamic-element")
private List<DynamicElement> dynamicElement= new ArrayList<>();

// Constructors
 public BlogEntryContent() {
 }  

//Getters an Setters
...

和类 DynamicElement

@JsonIgnoreProperties(ignoreUnknown=true)
public class DynamicElement implements Serializable {

    @JacksonXmlElementWrapper(localName = "dynamic-content")
    private List<DynamicContent> dynamicContent = new ArrayList<>();

    //Constructors
    public DynamicElement() {
    }

    public DynamicElement(List<DynamicContent> dynamicContent) {

        this.dynamicContent = dynamicContent;
    }

    //Getters and Setters
    ...

但这实际上不起作用:-(

2 个答案:

答案 0 :(得分:0)

您需要在@XmlRootElement类的BlogEntryContent批注中提供rootElement名称。这里无法识别XML数据的根元素。

尝试使用: @XmlRootElement(name = "root")。它将起作用。

答案 1 :(得分:0)

@pratik将我引向正确的方向。 正确的代码如下所示:

@JsonIgnoreProperties(ignoreUnknown=true)
@JacksonXmlRootElement(localName = "root")
public class BlogContent {
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "dynamic-element")
List dynElem;

//Constructor
...

//Getters
...

}

重要的是使用 @JacksonXmlRootElement(localName =“ root”)设置根名称,并设置 JacksonXmlElementWrapper(useWrapping = false),因为其中没有包装器xml! @XmlRootElement(name =“ root”)也可以!