2010-01-06 29 views
6

Hy vọng một câu hỏi với một câu trả lời rất đơn giản, nhưng nó không phải là một mà tôi đã có thể tìm thấy. Tôi có một tài liệu XML nhỏ trông gần như thế này:Trong C# làm thế nào tôi có thể deserialize một tài liệu XML có chứa một danh sách các yếu tố mà không có một yếu tố danh sách xung quanh

<aa> 
    <bb><name>bb1</name></bb> 
    <bb><name>bb2</name></bb> 
    <bb><name>bb3</name></bb> 
</aa> 

tôi có các lớp học mà đại diện cho aa và bb

[XmlRoot("aa")] 
public class aa 
{ 
    [XmlArray("bbs")] 
    [XmlArrayItem("bb")] 
    public bb[] bbs; 
} 

public class bb 
{ 
    [XmlElement("name")] 
    public string Name; 
} 

Khi tôi cố gắng deserialize các tài liệu sử dụng XmlSerializer tôi nhận được một đối tượng aa với một thuộc tính null bbs. Theo tôi được biết điều này là do các thuộc tính Tôi đã sử dụng trên tài sản bbs nói serializer để mong đợi một tài liệu như thế này:

<aa> 
    <bbs> 
    <bb><name>bb1</name></bb> 
    <bb><name>bb2</name></bb> 
    <bb><name>bb3</name></bb> 
    </bbs> 
</aa> 

Cho rằng tôi không thể thay đổi định dạng của XML Tôi nhận được, là có một cách để nói cho XmlSerialiser để mong đợi một mảng mà không được gói bên trong một thẻ khác?

Trả lời

8

Hãy thử thay thế [XmlArray("bbs")][XmlArrayItem("bb")] của bạn thuộc tính với một đĩa đơn [XmlElement] thuộc tính

[XmlRoot("aa")] 
public class aa 
{ 
    [XmlElement("bb")] 
    public bb[] bbs; 
} 

public class bb 
{ 
    [XmlElement("name")] 
    public string Name; 
} 

Bằng cách đặt các ArrayArrayItem thuộc tính, bạn đã được mô tả một cách rõ ràng làm thế nào để serialize này như là một mảng với một bao bì container.

+0

Tuyệt vời, cảm ơn – Dan

4

Thay đổi [XmlArray]/[XmlArrayItem] thành [XmlElement], thông báo cho bộ nối tiếp các yếu tố không có trình bao bọc, ví dụ:

[XmlRoot("aa")] 
public class aa 
{ 
    [XmlElement("bb")] 
    public bb[] bbs; 
} 

public class bb 
{ 
    [XmlElement("name")] 
    public string Name; 
} 
Các vấn đề liên quan