2016-02-12 34 views
4

我使用的是改造2與SimpleXmlConverter和我創建一個SOAP請求對象時所面臨的問題沒有影響,那就是基本上有4個元素孩子是他們中的每一個元素不同的數據類型。@Order註釋具有XML序列化爲了

這裏是XML輸出我想生產。元素順序必須遵守:

<prf:container> 
    <prf:aaa>111111111</prf:aaa> 
    <prf:bbb>true</prf:bbb> 
    <prf:element> 
     <prf:ddd>50</prf:ddd> 
     <prf:eee>false</prf:eee> 
    </prf:element> 
    <prf:ccc>textcontent</prf:ccc> 
</prf:container> 

現在,這裏是我的Android類,Container.java,代表SOAP請求對象將被序列化:

@Root (name = "prf:container") 
@Order(elements={"prf:aaa", "prf:bbb", "prf:element", "prf:ccc"}) 
public class Container { 

    @Element (name = "prf:aaa") 
    private int aaa; 

    @Element(name = "prf:bbb") 
    private boolean bbb; 

    @Element (name = "prf:element", required = false) 
    private MyElement myElement; 

    @Element (name = "prf:ccc", required = false) 
    private String ccc; 

} 

按照簡單的XML架構文檔:

By域的缺省序列是按照聲明的順序進行。

但是,在Android中,這是不正確的,至少在某些情況下。無論我如何在我的Container類中設置字段聲明順序,輸出總是具有相同的元素順序。這是一個已知的錯誤,正如其他SO帖子中所報告的那樣。

儘管如此,這個問題還是有解決的。 Order註釋。 瞭解更多in the Javadoc

我的問題是使用Order標註在我的情況沒有幫助。請注意,我的所有元素的名稱都有一個前綴 - prf:

如果我從所有元素名稱中刪除prf前綴,則Order註釋將正常工作,並強制XML序列化具有已定義的順序。但輸出元素的名稱上不會有前綴。

但我真的需要我的要素有其名稱前綴,否則我的要求將有一個500的響應。我也必須在我的XML輸出中具有所需的元素順序。

對此的任何解決方案?

謝謝

+0

嗨我試過你的上述解決方案。它在Android版本大於或等於5.0的設備上工作正常,但在其下的設備上,訂單不會被保留。你能建議解決這個問題嗎? –

回答

5

我知道,因爲你張貼了這個問題,它一直是一個長期項目,但,我想回答的情況下,任何人都面臨着同樣的問題,你的問題。我通過執行以下操作解決了相同的問題:

對於要按照所需順序與元素一起準備的XML文檔,如果元素具有前綴,@Order註釋在某些情況下可能不起作用。在你的情況下,每個元素的@Order註釋中提到的前綴'prf'將無法按照你的要求排序。

「缺省情況下,字段序列化按聲明順序完成。」

我不相信這一點,特別是當你有元素的前綴時。所以,我嘗試更改Java變量名稱。我嘗試按照我在生成的xml中需要的方式按照字母順序對它們進行命名。因此,您可以按如下方式更改變量名稱:

@Root (name = "prf:container") 
public class Container { 

    @Element (name = "prf:aaa") 
    private int element1; 

    @Element(name = "prf:bbb") 
    private boolean element2; 

    @Element (name = "prf:element", required = false) 
    private MyElement element3; 

    @Element (name = "prf:ccc", required = false) 
    private String element4; 

} 

這將根據您的需要形成xml文檔。您可能會想知道,如果我們將變量名稱更改爲泛型,那麼它們並不代表它們實際存在的內容,而是始終可以擁有getter和setter。例如,你的情況,你可以有:

public void setAaa(String aaa){ 
    this.element1 = aaa; 
} 

public String getAaa(){ 
    return element1; 
} 

以同樣的方式,你可以隨時生成的字母順序排列變量的類,以確保生成的XML具有所需格式的元素。

0

也許你使用的@Order語法錯誤,按字母順序並不重要。您可以嘗試:

@Root (name = "prf:container") 
@Order(elements={"prf:container/prf:aaa", "prf:container/prf:bbb", "prf:container/prf:element", "prf:container/prf:ccc"}) 
public class Container { 

    @Element (name = "prf:aaa") 
    private int aaa; 

    @Element(name = "prf:bbb") 
    private boolean bbb; 

    @Element (name = "prf:element", required = false) 
    private MyElement myElement; 

    @Element (name = "prf:ccc", required = false) 
    private String ccc; 
} 
0

SimpleXML按字母順序自動排序正在工作。但是在一個條件下:這些字段的類型應該是相同的,通常對於XML來說它是String。我花了很長時間才弄清楚,我有不同的類型,並且按名稱排序不起作用。由於我已將所有字段更改爲字符串,就像魅力一樣。

@Root(name = "sch:CheckPaymentRequest", strict = true) 
public class CheckPaymentData { 

@Element(name = "sch:payId") 
private String Aaa1; 

@Element(name = "sch:fromCurrency") 
private String Bbb2; 

@Element(name = "sch:fromAmount") 
private String Ccc3; 
...}