2010-07-21 16 views
44

Tôi muốn XML theo định dạng sau:sử dụng XmlArrayItem thuộc tính mà không XmlArray trên Serializable C# lớp

<configuration><!-- Only one configuration node --> 
    <logging>...</logging><!-- Only one logging node --> 
    <credentials>...</credentials><!-- One or more credentials nodes --> 
    <credentials>...</credentials> 
</configuration> 

Tôi đang cố gắng để tạo ra một lớp Configuration có thuộc tính [Serializable]. Để serialize các chứng chỉ nút, tôi đã điều sau đây:

[XmlArray("configuration")] 
[XmlArrayItem("credentials", typeof(CredentialsSection))] 
public List<CredentialsSection> Credentials { get; set; } 

Tuy nhiên, khi tôi serialize này sang XML, XML là định dạng sau:

<configuration> 
    <logging>...</logging> 
    <configuration><!-- Don't want credentials nodes nested in a second 
         configuration node --> 
    <credentials>...</credentials> 
    <credentials>...</credentials> 
    </configuration> 
</configuration> 

Nếu tôi loại bỏ các dòng [XmlArray("configuration")], tôi có được những điều sau đây:

<configuration> 
    <logging>...</logging> 
    <Credentials><!-- Don't want credentials nodes nested in Credentials node --> 
    <credentials>...</credentials> 
    <credentials>...</credentials> 
    </Credentials> 
</configuration> 

Làm thế nào tôi có thể serialize này cách tôi muốn, với nhiều <credentials> nút trong nút đơn gốc <configuration> ? Tôi muốn làm điều này mà không cần phải thực hiện IXmlSerializable và làm serialization tùy chỉnh. Đây là cách lớp của tôi được mô tả:

[Serializable] 
[XmlRoot("configuration")] 
public class Configuration : IEquatable<Configuration> 

Trả lời

67

Sau đây phải sắp xếp theo thứ tự đúng cách bạn muốn. Đầu mối là [XmlElement("credentials")] trong danh sách. Tôi đã làm điều này bằng cách lấy xml của bạn, tạo ra một lược đồ (xsd) từ nó trong Visual Studio. Sau đó chạy xsd.exe trên lược đồ để tạo một lớp. (Và một số chỉnh sửa nhỏ)

public class CredentialsSection 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
} 

[XmlRoot(Namespace = "", IsNullable = false)] 
public class configuration 
{ 
    /// <remarks/> 
    public string logging { get; set; } 

    /// <remarks/> 
    [XmlElement("credentials")] 
    public List<CredentialsSection> credentials { get; set; } 

    public string Serialize() 
    { 
     var credentialsSection = new CredentialsSection {Username = "a", Password = "b"}; 
     this.credentials = new List<CredentialsSection> {credentialsSection, credentialsSection}; 
     this.logging = "log this"; 
     XmlSerializer s = new XmlSerializer(this.GetType()); 
     StringBuilder sb = new StringBuilder(); 
     TextWriter w = new StringWriter(sb); 
     s.Serialize(w, this); 
     w.Flush(); 
     return sb.ToString(); 
    } 
} 

cung cấp cho các đầu ra sau đây

<?xml version="1.0" encoding="utf-16"?> 
<configuration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <logging>log this</logging> 
    <credentials> 
    <Username>a</Username> 
    <Password>b</Password> 
    </credentials> 
    <credentials> 
    <Username>a</Username> 
    <Password>b</Password> 
    </credentials> 
</configuration> 
+2

Yep, mà làm việc! Tôi đã được thiết lập trên "nó là một' Danh sách', gotta sử dụng thuộc tính 'XmlArrayItem' một nơi nào đó" mà tôi thậm chí không nghĩ rằng làm cho nó một thường xuyên 'XmlElement'. –

+2

câu trả lời tốt, tôi đã có cùng một vấn đề - tôi muốn loại bỏ: giải quyết nó với: [XmlElement ("DataItem")] public List DataItem {get; bộ; } – nologo

+0

Cảm ơn Mikael. Điều này đã giúp tôi với vấn đề của tôi ngày hôm nay. +1 – John