7

Android アプリで SimpleXml 2.6.1 を使用しています。ドキュメント (http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html) には、xml 内の要素の順序は方法と同じであると記載されていますが、それらはクラスファイルで定義されています。私は常にxmlでランダムな順序を取得しています。さらにいくつかの変数を追加すると、要素の順序が再び変わります。

@Order 表記を追加すると機能しますが、クラスは数百の変数で複雑であるため、順序を追加したくありません。これは Android バージョンの既知のバグですか? Java コンソール プログラムでは問題なく動作します。

ps: .class ファイルを逆アセンブルして開いたところ、Java ファイルと同じ順序で変数が宣言されていることがわかったので、クラス ファイルの問題ではないと思います。

4

3 に答える 3

5
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;
    ...
于 2016-01-13T17:45:43.993 に答える
1

Simple Xml は、Android で順序を保持しません。pfhの回答に基づいて、これが私の推奨事項です。順序を保持したい場合は、手動の文字列/テンプレート解析よりもJAXBを使用することをお勧めします。JAXB は SimpleXml よりも使用が少し複雑ですが、xml シリアライゼーションおよびデシリアライゼーションに基づく同様の一連の注釈が付属しています。

于 2013-03-30T18:54:56.217 に答える
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;
    }
}

テスト:

import org.junit.Test;

import static junit.framework.Assert.*;

/**
 * User: ksaric
 */

public class SimpleXmlTest {

    @Test
    public void test() throws Exception {
        //Before

        /* Use standard instantiation, factory method recommended for immutability */
        SimpleXml simpleXml = new SimpleXml();
        simpleXml.setName("This is a name");
        simpleXml.setTrue(false);

        //When
        String result = simpleXml.toString();

        //Then
        assertNotNull(result);
        System.out.println(result);
    }
}

本当の答えではありませんが、時間を節約し、Android で Simple (これは素晴らしいライブラリです) を使用しないでください...

于 2013-03-29T12:21:51.110 に答える