2011-09-29 25 views
5

Tôi đang sử dụng SimpleXml 2.6.1 trong ứng dụng Android của mình. Mặc dù tài liệu (http://simple.sourceforge.net/download/stream/doc/javadoc/index.html?org/simpleframework/xml/Order.html) cho biết thứ tự của các phần tử trong xml giống như cách chúng đã được định nghĩa trong tệp lớp, tôi luôn nhận được thứ tự ngẫu nhiên trong xml. Nếu tôi thêm vài biến nữa, thứ tự của các phần tử lại thay đổi.Xml đơn giản - thứ tự của các phần tử không được bảo quản?

Thêm ký hiệu @Order, nhưng vì lớp này phức tạp với 100 biến số, tôi không muốn thêm thứ tự. Đây có phải là lỗi đã biết cho các phiên bản Android không? Nó hoạt động tốt trong các chương trình giao diện điều khiển java.

p.s: Tôi đã mở tệp .class đã tháo rời và tìm thấy các biến được khai báo theo cùng thứ tự như tệp java, vì vậy tôi không nghĩ đó là vấn đề về tệp lớp.

+1

Bạn đã tìm thấy giải pháp nào hay lý do khiến ứng dụng Android không giữ được thứ tự? Có khả năng là phiên bản Android XPP gây ra điều này? – pfh

+0

[Tôi đã trả lời câu hỏi đó tại đây] (https://stackoverflow.com/a/48677998/3847464) –

Trả lời

1

Vì không có câu trả lời, tôi sẽ cố gắng tiết kiệm thời gian quý báu cho bất kỳ ai đến đây.

Tôi không tìm thấy nguyên nhân và vì tôi không có thời gian để phân tích các thư viện đơn giản, tôi đã đưa ra một "workaroud". Đó là nhiều hơn một lời khuyên, thực sự - không sử dụng nó cho (marshaling) tạo xml nếu bạn có một định nghĩa xml lớn và thứ tự các vấn đề (một quy tắc nhiều hơn một ngoại lệ). Thứ tự được sử dụng chủ yếu cho marshaling anyway vì vậy chỉ cần tiết kiệm cho mình một số thời gian và làm điều đó bằng tay.

Mẫu:

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

Lớp:

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; 
    } 
} 

Các thử nghiệm:

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); 
    } 
} 

Không thực sự là một câu trả lời, nhưng tiết kiệm cho mình một chút thời gian và không sử dụng Đơn giản (một thư viện tuyệt vời) trên Android ...

+0

pfh, không thực sự chắc chắn câu trả lời này phù hợp ở đây. Có nhiều cách làm xml serialization/deserialization bằng tay. Xem câu trả lời mới của tôi cho đề xuất của tôi. – bschandramohan

+1

Nó không sai, và có lẽ nó không phải là một cách tốt để làm điều này, nhưng ít nhất nó hoạt động. Câu trả lời của bạn sẽ hữu ích hơn, nhưng ngay cả khi câu trả lời của tôi là một sai lầm, hãy để mọi người nhìn thấy nó để họ không phải đi theo con đường tôi đã đi. Tôi không có nhiều thời gian để hoàn thành nhiệm vụ và tôi đã quyết định sử dụng phương pháp đơn giản nhất - tôi không muốn bị kẹt trong thư viện khác. – pfh

0

Xml đơn giản không bảo toàn Đơn đặt hàng trên Android. Dựa trên câu trả lời của pfh, đây là khuyến nghị của tôi: Tôi muốn sử dụng JAXB trong trường hợp bạn muốn thứ tự được bảo quản hơn so với phân tích cú pháp chuỗi/mẫu thủ công. JAXB hơi phức tạp để sử dụng so với SimpleXml nhưng đi kèm với một loạt các chú thích tương tự dựa trên xml serialization và deserialization.

+0

Có vẻ như JAXB không khả dụng cho android – 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; 
    ... 
Các vấn đề liên quan