2011-12-10 26 views
7

Tôi chỉ mới bắt đầu thử nghiệm với Android Development với SimpleXML và nghĩ rằng nó sẽ hoạt động khá tốt cho đến khi tôi bị đánh. Đoạn mã dưới đây tạo ra một ngoại lệ củaSimpleXML Constructor Exception - Không thể tạo Inner Class

W/System.err (665): org.simpleframework.xml.core.ConstructorException: Không thể xây dựng lớp bên

Tôi đã nhìn qua những câu hỏi trên các lớp bên trong và nghĩ rằng tôi hiểu tại sao bạn sẽ sử dụng chúng (không phải là của tôi nhất thiết là cố ý) nhưng mặc dù di chuyển mã của tôi vòng để thử và tránh sử dụng tôi vẫn còn một chút khó khăn và sẽ đánh giá cao sự giúp đỡ nào.

Source Code:

public class InCaseOfEmergencyMedAlertAllergiesActivity extends Activity { 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 


    Serializer serializer = new Persister(); 
    InputStream xmlstream = this.getResources().openRawResource(R.raw.sample_data_allergies); 
    try { 
     medalertdata allergyObject = serializer.read(medalertdata.class, xmlstream); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    setContentView(R.layout.allergies); 
} 

@Root 
public class medalertdata { 
    @ElementList 
    private List<allergy> allergyList; 

    public List getAllergies() { 
     return allergyList; 
    } 
} 

@Root 
public class allergy{ 

    @Element 
    private String to; 

    @Element 
    private Boolean medical; 

    @Element 
    private String notes; 

    public allergy(String to, Boolean medical, String notes){ 
     this.to = to; 
     this.medical = medical; 
     this.notes = notes; 
    } 

    public String getTo() { 
     return to; 
    } 

    public Boolean getMedical() { 
     return medical; 
    } 

    public String getNotes() { 
     return notes; 
    } 


} 

}

Với các tập tin XML tham chiếu cấu trúc như:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<medalertdata> 
<allergy> 
    <to>Penicillin</to> 
    <medical>true</medical> 
    <notes></notes> 
</allergy> 
<allergy> 
    <to>Bee Stings</to> 
    <medical>false</medical> 
    <notes>Sample</notes> 
</allergy> 
</medalertdata> 

Là vấn đề với cách tôi đã chú thích các lớp SimpleXML hoặc nơi tôi đang cố gắng để đọc chúng? Cảm ơn!

Trả lời

5

Thử xóa @Root khỏi lớp allergy.

Ngoài ra: bạn có hai lớp này trong mỗi tệp riêng biệt: allergy.java và medalertdata.java?

+0

Cảm ơn bạn đã trả lời. Việc xóa ký hiệu @Root không may là không có hiệu lực. Hiện tại cả hai lớp được khai báo trong lớp Activity sau khi onCreate() đã bị đóng - chúng có nằm trong các tệp khác nhau không? – Rory

+4

Có, tất cả các lớp công khai bình thường trong Java phải được khai báo trong tệp của riêng chúng. Một tùy chọn khác là làm cho chúng 'tĩnh' (không biết cách SimpleXML xử lý việc này). –

+2

Có chúng trong cùng một tệp chắc chắn là vấn đề =) – Rory

12

Tôi cũng gặp phải điều này khi đọc một số dữ liệu XML lồng nhau sâu vào các đối tượng Java (và muốn giữ cấu trúc đối tượng đơn giản bằng cách xác định các lớp trong cùng một tệp).

Giải pháp (không liên quan đến việc tách thành các tệp riêng biệt) là đặt các lớp lồng nhau tĩnh. (Nói cách khác, chuyển đổi inner classes into static nested classes.) Kinda rõ ràng trong hồi tưởng.

Ví dụ;
cấu trúc lồng nhau:

// ScoreData 
// Sport 
//  Category 
//  Tournament 

Java:

@Root 
public class ScoreData { 

    @ElementList(entry = "Sport", inline = true) 
    List<Sport> sport; 

    static class Sport { 
     @ElementList(entry = "Category", inline = true) 
     List<Category> category; 
    } 

    // ... 
} 

Disclaimer: Tôi nhận ra OP có vấn đề giải quyết đã có, nhưng có lẽ điều này sẽ giúp những người khác chạy vào org.simpleframework.xml.core.ConstructorException: Can not construct inner class và không muốn để xác định các lớp trong các tệp riêng biệt như Peter's answer đề xuất.

+3

Cảm ơn.Điều này cảm thấy sạch hơn nhiều so với việc tách ra một loạt các lớp đơn sử dụng thành các tệp riêng biệt. –

Các vấn đề liên quan