2012-10-16 42 views
22

Tôi có một tài liệu XML tương tự như sau:Sử dụng XmlSerializer với một mảng trong phần tử gốc

<scan_details> 
    <object name="C:\Users\MyUser\Documents\Target1.doc"> 
     ... 
    </object> 
    <object name="C:\Users\MyUser\Documents\Target2.doc"> 
     ... 
    </object> 
    ... 
</scan_details> 

Tôi đang hy vọng sẽ sử dụng thuộc tính System.Xml.Serialization để đơn giản hóa deserialization XML. Vấn đề tôi có là tôi không thể làm việc ra làm thế nào để xác định rằng nút gốc có chứa một mảng.

Tôi đã cố gắng tạo ra các loại sau đây:

[XmlRoot("scan_details")] 
public class ScanDetails 
{ 
    [XmlArray("object")] 
    public ScanDetail[] Items { get; set; } 
} 

public class ScanDetail 
{ 
    [XmlAttribute("name")] 
    public string Filename { get; set; } 
} 

Tuy nhiên khi tôi deserialize XML vào đối tượng ScanDetails mảng Items vẫn null.

Làm cách nào để deserialize một mảng trong nút gốc?

Trả lời

41

Bạn nên sử dụng [XmlElement] và không [XmlArray] để trang trí thuộc tính Mục - nó đã là một mảng và bạn chỉ muốn đặt tên phần tử.

public class StackOverflow_12924221 
{ 
    [XmlRoot("scan_details")] 
    public class ScanDetails 
    { 
     [XmlElement("object")] 
     public ScanDetail[] Items { get; set; } 
    } 

    public class ScanDetail 
    { 
     [XmlAttribute("name")] 
     public string Filename { get; set; } 
    } 

    const string XML = @"<scan_details> 
          <object name=""C:\Users\MyUser\Documents\Target1.doc""> 
          </object> 
          <object name=""C:\Users\MyUser\Documents\Target2.doc""> 
          </object> 
         </scan_details> "; 

    public static void Test() 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(ScanDetails)); 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML)); 
     var obj = xs.Deserialize(ms) as ScanDetails; 
     foreach (var sd in obj.Items) 
     { 
      Console.WriteLine(sd.Filename); 
     } 
    } 
} 
+0

Ah ... Đó là thuật ngữ khó hiểu mà họ sử dụng. Tôi đã tập trung vào 'XmlArray' và' XmlArrayItem'. Cảm ơn vì điều đó! –

+1

Nếu một mảng, nhưng không chỉ dưới cấp độ gốc, sau đó thuộc tính mảng vẫn có vẻ cần [XmlArray ("arrayElementName")], và không [XmlElement ("arrayElementItemName")], nhưng nếu theo cấp cơ sở như câu trả lời của bạn nó cần [XmlElement ("arrayElementItemName")] bạn có biết tại sao không? Nó giống như ở cấp cơ sở bạn mô tả các kiểu phần tử lặp lại bên trong, và ở đâu đó kiểu mảng. – CRice

+0

Tôi chỉ muốn dành một chút thời gian để cảm ơn bạn. Tôi lùng sục qua nhiều câu trả lời cho nhiều câu hỏi và đây là điều duy nhất hoạt động. Nó không rõ ràng đến mức bạn không cần định nghĩa thuộc tính mảng trên phần tử gốc, cũng không phải phần tử mảng. – Gaugeforever

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