2011-01-23 40 views
10

Tôi đang cố gắng để có được kết quả này trong khi xuất XMLSerialize mảng mà không cần phần tử gốc

<Test> 
    <Category> 
    <FileName>C:\test.txt</FileName> 
    <!-- Note that here this is an array of a simple class with two fields 
     without root --> 
    <Prop1>1</Prop1> 
    <Prop2>2</Prop2> 

    <Prop1>4</Prop1> 
    <Prop2>5</Prop2> 
    <!-- End array --> 
    </Category> 
</Test> 

Tôi đã thử những điều khác nhau như thế này

[Serializable] 
[XmlRoot("Test")] 
public class Test 
{ 
    [XmlElement("Category")] 
    public List<Category> Category= new List<Category>(); 
} 

[Serializable] 
[XmlRoot("Category")] 
public class Category 
{ 
    [XmlElement("FileName")] 
    public string FileName { get; set; } 

    [XmlElement("Property")] 
    public List<Property> Properties = new List<Property>(); 
} 

[Serializable] 
public class Property 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

Nhưng tôi vẫn nhận được kết quả này:

<Test> 
    <Category> 
    <FileName>C:\test.txt</FileName> 
    <Property> 
     <Prop1>1</Prop1> 
     <Prop2>2</Prop2> 
    </Property> 
    <Property> 
     <Prop1>4</Prop1> 
     <Prop2>5</Prop2> 
    </Property> 
    </Category> 
</Test> 

Tôi làm cách nào để xóa thẻ Thuộc tính ?? Cảm ơn rất nhiều trước

+2

XML của bạn đang cố gắng để đạt có vẻ khá mơ hồ với tôi. Có hai nút con có cùng tên ở cùng cấp không có vẻ chính xác. –

+0

Đầu tiên cảm ơn Yads cho câu trả lời của bạn Tôi nhận tệp này từ nguồn bên ngoài và tôi đồng ý với bạn rằng đó không phải là tệp xml tốt nhưng bạn có thể tưởng tượng chúng tôi đã yêu cầu người chỉnh sửa nguồn bị lỗi sửa chữa đầu ra của họ ... – Khoumbe

Trả lời

2

Không, điều đó là không thể mà không làm mọi thứ phức tạp. Một tùy chọn là triển khai IXmlSerializable, là cứng để nhận được 100% quyền. Bạn có thể cũng có thể làm như vậy bằng cách tạo hai loại phụ, sử dụng các phiên bản dựa trên loại [XmlArrayItem] và hack mô hình thành từng phần. Thành thật mà nói tôi không nghĩ rằng đó là giá trị nó.

Tùy chọn cá nhân của tôi ở đây sẽ là chọn bố cục khác hoặc sử dụng LINQ-to-XML. Đây không phải là điều tốt cho XmlSerializer.

+0

Cảm ơn Marc đã trả lời của bạn Tôi dự định triển khai giải pháp IXmlSerializable nhưng cuối cùng giải pháp với XmlChoiceIdentifier hoạt động tốt Cảm ơn bạn đã trả lời – Khoumbe

+0

Có thể, và không khó - xem câu trả lời được chấp nhận cho http://stackoverflow.com/ câu hỏi/2006482/c-sharp-xml-serialization-disable-rendering-root-phần tử-of-mảng –

6

Trong trường hợp nếu bạn thực sự cần sản lượng chính xác, như đã nêu ở trên, bạn có thể sử dụng workaround như thế này:

[Serializable] 
public partial class Test { 
    public List<Category> Category; 
} 

[Serializable] 
public partial class Category { 
    [XmlElement("FileName")] 
    public string FileName; 

    [XmlElement("Prop1")] 
    [XmlElement("Prop2")] 
    [XmlChoiceIdentifier("propName")] 
    public string[] Properties; 

    [XmlIgnore] 
    public PropName[] propName; 
} 

public enum PropName { 
    Prop1, 
    Prop2, 
} 
+0

Andrey Tôi muốn cảm ơn bạn vì cách giải quyết này Tôi thực hiện nó và nó làm những thứ mà tôi hiểu rằng nó không phải là giải pháp sạch sẽ nhưng tôi sẽ sử dụng thời gian trình soạn thảo Nguồn Xml chính xác t sản lượng thừa kế Thansk lần nữa 1000 lần – Khoumbe

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