簡體   English   中英

JAXB 忽略響應 XML 中的“額外”元素

[英]JAXB Ignore 'extra' elements from Response XML

我收到一個 XML 響應,並且它一直在非常頻繁地更改(節點不斷增加或減少)。 在響應 xml 中的每次更新之后,我的代碼都會中斷,因為我映射的 Java 類沒有所有文件。

如果響應 XML 中發生任何更改,有什么方法可以避免我的代碼中斷。

任何幫助將不勝感激。

謝謝。

使用JAXB.unmarshal()可以簡單地從 XML 創建 Java 對象。

默認情況下,它是非常自由的。

引用javadoc

此外,解組方法具有以下特點:

  1. 不對輸入 XML 執行架構驗證。 即使 XML 中有錯誤,處理也會盡可能地繼續。 僅作為最后的手段,此方法會因 DataBindingException 而失敗。

那么JAXB.unmarshal()所做的就是嘗試將盡可能多的數據從 XML“傳輸”到 Java,它並不關心 XML 元素或屬性是否沒有 Java 字段,它也不關心請注意是否存在沒有 XML 元素或屬性的 Java 字段。

例子

讓我們嘗試將以下 XML 解組為java.awt.Point的實例:

<p hi="Yo">
    <y>123</y>
    <peach>weor</peach>
</p>

Java代碼:

String s = "<p hi=\"Yo\"><y>123</y><peach>weor</peach></p>";
Point p = JAXB.unmarshal(new StringReader(s), Point.class);
System.out.println(p); // Prints "java.awt.Point[x=0,y=123]"

我們告訴JAXB.unmarshal()解析java.awt.Point實例。 輸入 XML 包含一個元素<y> ,它可以與Point.y匹配,因此解析了一個int並將其設置為Point.y 沒有找到Point.x XML 數據,所以它沒有被觸及。 屬性hi和 XML 元素<peach>不匹配,因此它們根本沒有用於任何東西。

我們在這里絕對沒有Exception ,並且盡可能多地解析並從 XML 傳輸到 Java。

為了應對未知字段,您可以添加一個List<Object>屬性注釋@XmlAnyElement(lax=true)

@XmlAnyElement(lax = true)
private List<Object> anything;

輸入中與類的顯式屬性不對應的任何元素都將被掃入此列表。 如果JAXBContext知道該元素,您將獲得未編組的形式( @XmlRootElement注釋類或JAXBElement<Foo> ),如果該元素不為上下文所知,您將獲得org.w3c.dom.Element .

Blaise 的博客中的完整詳細信息

對於被刪除的節點,只要您使用可以為 null 的類型( Integer而不是intBoolean而不是boolean等),您應該沒問題。

暫無
暫無

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

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