2011-09-29 9 views
5

私はandroid appでSimpleXml 2.6.1を使用しています。このドキュメントのドキュメント(http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html)によると、xmlの要素の順序はその方法と同じです彼らはクラスファイルで定義されている、私はいつもxmlでランダムになるように指示を受けています。さらにいくつかの変数を追加すると、要素の順序が再び変わります。単純なXML - 要素の順序が保存されていませんか?

@Order表記を追加することはできますが、クラスが100sの変数と複雑なので、注文を追加したくありません。これはアンドロイド版の既知のバグですか?それはJavaコンソールプログラムで正常に動作します。

p.s:.classファイルを逆アセンブルして開き、javaファイルと同じ順序で宣言された変数が見つかったため、クラスファイルの問題ではないと思います。

+1

Androidアプリが注文を保存しない理由や理由が見つかりましたか? XPPのアンドロイド版がこれを引き起こす可能性はありますか? – pfh

+0

[私はここにその質問に答えました](https://stackoverflow.com/a/48677998/3847464) –

答えて

1

答えがないので、ここにいる人に貴重な時間を節約しようとします。

シンプルライブラリを解析する時間がないので、私は「ワークワード」を思いついた。それはアドバイスのほうです。実際には、大きなxml定義があり、注文が問題であれば(マーシャリング)、xmlを作成するためには使用しないでください(例外よりもルール)。順序は主にマーシャリングに使用されるので、時間を節約して手動で行います。

テンプレート:

<document> 
    <name>$NAME$</name> 
    <isTrue>$IS_TRUE$</isTrue> 
</document> 

クラス:

import org.apache.commons.io.IOUtils; 

import java.io.IOException; 
import java.io.InputStream; 

/** 
* User: ksaric 
*/ 

public class SimpleXml { 

    public static final String NAME = "$NAME$"; 
    public static final String IS_TRUE = "$IS_TRUE$"; 

    private String name; 
    private Boolean isTrue; 

    public SimpleXml() { 
    } 

    public Boolean getTrue() { 
     return isTrue; 
    } 

    public void setTrue(Boolean aTrue) { 
     isTrue = aTrue; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     String template = null; 

     try { 
      template = getTemplate(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     /* GUAVA - checkNotNull() */ 
     if (null == template) return null; 

     template = template.replace(NAME, getName()); 

     /* OR CONVERT IN THE GETTER METHOD */ 
     template = template.replace(IS_TRUE, getTrue().toString()); 

     return template; 
    } 

    /* SINGLETON? Performance(IO) loss... */ 
    public String getTemplate() throws IOException { 
     InputStream templateStream = getClass().getResourceAsStream("/template.xml"); 

     /* APACHE IO COMMONS */ 

     /* 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>1.3.2</version> 
     </dependency> 
     */ 

     final String stringTemplate = IOUtils.toString(templateStream); 

     return stringTemplate; 
    } 
} 

テスト:本当に

​​

ない答えが、自分自身にいくつかの時間を節約し、使用しないでくださいAndroid上のシンプル(これは素晴らしい図書館です)...

+0

pfh、本当にこの答えがここに収まるのは間違いありません。 xmlのシリアル化/デシリアライズを手動で行う方法はたくさんあります。私の新しい答えを私の推薦で見てください。 – bschandramohan

+1

これは間違いではないし、これを行うには良い方法ではないかもしれないが、少なくともそれは機能する。あなたの答えはもっと助かりますが、私の答えが間違いであっても、私が歩いた道を歩く必要がないようにみんなに見せてください。私はその作業を完了するまでに多くの時間を要しませんでしたが、私は最も簡単な方法を使用することに決めました - 私は別の図書館で立ち往生したくありませんでした。 – pfh

0

シンプルなXmlはAndroidでOrderを保持しません。 pfhの答えに基づいて、ここに私の推薦があります: マニュアル文字列/テンプレートの解析よりも注文を保存したい場合は、JAXBを使用することをお勧めします。 JAXBはSimpleXmlよりもやや複雑ですが、xmlのシリアライゼーションとデシリアライゼーションに基づく類似のアノテーションセットが付属しています。

+0

JAXBはアンドロイドで利用できないようです – naveejr

1
import org.simpleframework.xml.Element;  
import org.simpleframework.xml.Order; 

    @Order(elements = {"name", "isTrue"}) 
    public class SimpleXml { 

     public static final String NAME = "$NAME$"; 
     public static final String IS_TRUE = "$IS_TRUE$"; 

     @Element 
     private String name; 

     @Element 
     private Boolean isTrue; 
    ...