7

我在我的 android 应用程序中使用 SimpleXml 2.6.1。尽管文档(http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html)说xml中元素的顺序与方式相同他们已经在类文件中定义了,我总是在 xml 中得到随机的顺序。如果我再添加几个变量,元素的顺序会再次发生变化。

添加@Order 表示法有效,但由于该类具有100 个变量,因此我不想添加顺序。这是 android 版本的已知错误吗?它在 java 控制台程序中运行良好。

ps:我打开反汇编的.class文件,发现变量声明的顺序和java文件一样,所以我认为不是class文件的问题。

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 上保留 Order。根据 pfh 的回答,这是我的建议:在您希望保留订单而不是手动字符串/模板解析的情况下,我更愿意使用 JAXB。JAXB 使用起来比 SimpleXml 稍微复杂一些,但带有类似的基于注释的 xml 序列化和反序列化集。

于 2013-03-30T18:54:56.217 回答
1

由于没有答案,我会尽量为任何到达这里的人节省宝贵的时间。

我找不到任何原因,而且由于我没有时间分析 Simple 库,所以我想出了一个“workaroud”。实际上,这更像是一个建议 - 如果您有一个大的 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 回答