【问题标题】:Unmarshall inner CDATA in xml String在 xml 字符串中解组内部 CDATA
【发布时间】:2021-07-29 18:20:21
【问题描述】:

我需要在我的代码中解组以下名为 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;
    }
}

解组时的情况:

  • Erro 总是被屏蔽
  • ConsultaExtrato 正在变为空
Unmarshaller jaxbUnmarshaller = JAXBContext.newInstance(Extrato.class).createUnmarshaller();
Extrato extrato = (Extrato) jaxbUnmarshaller.unmarshal(new StringReader(retornoExtrato));

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

我在所有类中都尝试了一些额外的 jaxb 注释,但没有一个起作用。我在这里错过了什么?

【问题讨论】:

    标签: java jaxb unmarshalling cdata


    【解决方案1】:

    您需要告诉 JAXB XML 元素 &lt;consultaextrato&gt;&lt;extrato&gt; 元素内对应于 Extrato 类中的 Java 属性 consultaExtrato

    你可以通过注释这个属性(或者更确切地说它的 getter 或 setter 方法)来做到这一点 使用@XmlElement 并在此处提供 XML name

    @XmlElement(name = "consultaextrato")
    

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

    顺便说一句:@XmlRootElement(name = "consultaextrato") 仅当 &lt;consultaextrato&gt; 是根元素时才有效 您的 XML 内容,但如果 &lt;consultaextrato&gt; 是嵌套的 另一个元素中的元素(在你的情况下在&lt;extrato&gt; 元素)。

    【讨论】:

    • 你完全正确。效果很好!
    猜你喜欢
    • 2015-03-25
    • 2012-12-18
    • 2023-03-22
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2014-08-03
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多