简单的 XML - 元素顺序是否保留?

7
我正在我的安卓应用程序中使用SimpleXml 2.6.1。尽管文档(http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html)说xml元素的顺序与类文件中定义的顺序相同,但我总是得到xml的随机顺序。如果我添加了更多变量,则元素的顺序又会改变。添加@Order标记可以解决问题,但由于类非常复杂,有几百个变量,所以我不想添加顺序。这是android版本已知的问题吗?在Java控制台程序中可以正常工作。
附言:我打开了.dis文件并发现变量的声明顺序与java文件相同,所以我认为这不是一个类文件问题。

1
你找到任何解决方案或原因为什么Android应用程序不能保留顺序了吗?XPP Android版本可能会导致这种情况吗? - pfh
我在这里回答了那个问题。 - Zhangali Bidaibekov
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;
    ...

1
简单Xml在安卓上无法保留顺序。基于pfh的回答,这是我的建议: 如果你想要保持顺序,我更倾向于使用JAXB而不是手动的字符串/模板解析。虽然JAXB比SimpleXml稍微复杂一些,但它提供了类似注解的xml序列化和反序列化。

似乎在Android上没有可用的JAXB。 - naveejr

1

既然没有答案,我将尝试为到达此处的任何人节省宝贵的时间。

我没有找到原因,由于没有时间分析简单库,我想出了一个“解决方法”。实际上更多是建议 - 如果您有一个大的xml定义并且顺序很重要(比例大于例外),则不要使用它来(marshaling)创建xml。顺序通常用于marshaling,所以手动操作一下可以节省一些时间。

模板:

<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(尽管它是一个很好的库)...


pfh,不太确定这个答案是否适合在这里。有很多手动执行XML序列化/反序列化的方法。请查看我的新答案以获取我的建议。 - bschandramohan
1
这并不是错的,也许这不是一个好的方法,但至少它能够工作。你的答案会更有帮助,但即使我的回答是错误的,也让每个人都看到它,这样他们就不必走我走过的路了。我没有很多时间来完成任务,所以我决定使用最简单的方法——我不想陷入另一个库中。 - pfh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接