簡體   English   中英

Jackson XML - 從特定節點反序列化

[英]Jackson XML - Deserialize from specific node

我是 Jackson XML 的新手,我想做以下事情:

  1. 這是我想轉換為 Java DTO 的 XML:

     <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <cotacaoTaxaCambioResponse xmlns="http://tempuri.org/"> <cotacaoTaxaCambioResult xmlns:a="http://schemas.datacontract.org/2004/07/Exchange" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:TaxasCambio> <a:CotacaoTaxaCambio> <a:CLIENTEC>0</a:CLIENTEC> <a:CLIENTEV>0</a:CLIENTEV> <a:COMERCIALC>0</a:COMERCIALC> <a:COMERCIALV>30</a:COMERCIALV> <a:DATA>2021-12-15T00:00:00</a:DATA> <a:HORARIO>1027</a:HORARIO> <a:MOEDA>978</a:MOEDA> <a:PARIDADEC>1</a:PARIDADEC> <a:PARIDADEV>1</a:PARIDADEV> <a:TURISMOC>0</a:TURISMOC> <a:TURISMOV>30</a:TURISMOV> </a:CotacaoTaxaCambio> </a:TaxasCambio> <a:serviceStatus> <a:CODRETORNO>0</a:CODRETORNO> <a:MENSAGEM>Sucesso</a:MENSAGEM> <a:MENSAGEMEN>OK</a:MENSAGEMEN> <a:NRREFERENCE>0</a:NRREFERENCE> </a:serviceStatus> </cotacaoTaxaCambioResult> </cotacaoTaxaCambioResponse> </s:Body> </s:Envelope>
  2. 我需要的信息是 a:CotacaoTaxaCambio 節點的屬性。

  3. 創建了這個 DTO

     @JacksonXmlRootElement(localName = "a:CotacaoTaxaCambio") public class CotacaoResDTO { @JacksonXmlProperty(localName = "a:DATA") private String data; @JacksonXmlProperty(localName = "a:HORARIO") private String hora; @JacksonXmlProperty(localName = "a:MOEDA") private String codMoeda; @JacksonXmlProperty(localName = "a:COMERCIALV") private Double valorComercial; @JacksonXmlProperty(localName = "a:TURISMOV") private Double valorTurismo; }
  4. 如果我將此子集設置為輸入,它確實有效:

     <a:CotacaoTaxaCambio> <a:CLIENTEC>0</a:CLIENTEC> <a:CLIENTEV>0</a:CLIENTEV> <a:COMERCIALC>0</a:COMERCIALC> <a:COMERCIALV>30</a:COMERCIALV> <a:DATA>2021-12-15T00:00:00</a:DATA> <a:HORARIO>1027</a:HORARIO> <a:MOEDA>978</a:MOEDA> <a:PARIDADEC>1</a:PARIDADEC> <a:PARIDADEV>1</a:PARIDADEV> <a:TURISMOC>0</a:TURISMOC> <a:TURISMOV>30</a:TURISMOV> </a:CotacaoTaxaCambio>

但如果我將完整的 xml 設置為輸入,它不會反序列化。

是否有任何配置或注釋可用於存檔?

提前致謝,

不幸的是,目前 jackson 庫不直接支持SOAP協議,但是您可以使用XMLStreamReader class 直接指向相關標簽來閱讀您感興趣的部分:

XMLInputFactory f = XMLInputFactory.newFactory();
XMLStreamReader sr = f.createXMLStreamReader(new FileInputStream(xml));
XmlMapper mapper = new XmlMapper();
sr.nextTag();
while (!sr.getLocalName().equals("CotacaoTaxaCambio")) {
   sr.nextTag();
}
CotacaoResDTO value = mapper.readValue(sr, CotacaoResDTO.class);
sr.close();

您還必須修改CotacaoResDTO class 忽略未知屬性:

@JsonIgnoreProperties(ignoreUnknown = true)
public class CotacaoResDTO {

    @JacksonXmlProperty(localName = "DATA")
    private String data;

    @JacksonXmlProperty(localName = "HORARIO")
    private String hora;

    @JacksonXmlProperty(localName = "MOEDA")
    private String codMoeda;

    @JacksonXmlProperty(localName = "COMERCIALV")
    private Double valorComercial;

    @JacksonXmlProperty(localName = "TURISMOV")
    private Double valorTurismo;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM