首页 > 解决方案 > 在 xml 字符串中解组内部 CDATA

问题描述

我需要解组以下retornoExtrato在我的代码中命名的 xml 字符串

<?xml version="1.0" encoding="UTF-8" ?>
<extrato xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <erro>
      <codigo/>
      <descricao/>
   </erro>
   <consultaextrato>
      <header><![CDATA[SOME MULTIPLE
LINES HEADER]]></header>
      <body><![CDATA[SOME MULTIPLE
LINES BODY]]></body>
      <trailer><![CDATA[SOME MULTIPLE
LINES TRAILER]]></trailer>
   </consultaextrato>
</extrato>

进入一个Extrato对象,这是我的类(构造函数,getter 和 setter 在默认情况下被省略)

@XmlRootElement(name = "extrato")
public class Extrato {
    private Erro erro;
    private ConsultaExtrato consultaExtrato;
}

@XmlRootElement(name = "erro")
public class Erro {
    private String codigo;
    private String descricao;
}

@XmlRootElement(name = "consultaextrato")
public class ConsultaExtrato {
    private String header;
    private String body;
    private String trailer;

    @XmlCDATA
    public String getHeader() {
        return header;
    }

    @XmlCDATA
    public String getBody() {
        return body;
    }

    @XmlCDATA
    public String getTrailer() {
        return trailer;
    }
}

解组时的情况是:

Unmarshaller jaxbUnmarshaller = JAXBContext.newInstance(Extrato.class).createUnmarshaller();
Extrato extrato = (Extrato) jaxbUnmarshaller.unmarshal(new StringReader(retornoExtrato));

另一方面,如果我创建一个只有consultaextrato标签的 xml,它会被解组。但它似乎不能用作内部标签。

我在所有类中都尝试了一些额外的 jaxb 注释,没有一个有效。我在这里想念什么?

标签: javajaxbunmarshallingcdata

解决方案


您需要告诉 JAXB 元素中的 XML 元素<consultaextrato> 对应<extrato>于类中的 JavaconsultaExtrato属性Extrato

为此,您可以使用注释该属性(或者更确切地说是它的 getter 或 setter 方法)@XmlElement并在其中给出 XML名称

@XmlElement(name = "consultaextrato")

如果您不这样做,那么 JAXB 将从 Java 属性名称(即consultaExtrato)派生 XML 元素名称,因此由于拼写不同而无法匹配。

顺便说一句:@XmlRootElement(name = "consultaextrato") 只有当它<consultaextrato>是你的XML内容的根元素时才会有效果,但如果<consultaextrato>它是另一个元素内的嵌套元素(在你的情况下是在<extrato> 元素内)则没有效果。


推荐阅读