2013-11-15 20 views
5

Trong C# nếu tôi sắp xếp một đối tượng có một danh sách các đối tượng trong đó nó cũng sẽ sắp xếp danh sách?C# Sắp xếp lại một đối tượng với một danh sách các đối tượng trong đó

Ví dụ

public class Move { 
    public string MoveName {get; set;} 

    public List<Tag> oTags = new List<Tag>; 
} 

public class Tag { 
    public string TagName {get; set;} 
} 

Nếu tôi serialize thái này sẽ tất cả các thẻ lưu trữ trong di chuyển được đăng không? Ngoài ra nếu nó sẽ không serialize danh sách như thế nào tôi sẽ đi về làm cho nó làm điều đó?

<Move> 
    <MoveName>name</MoveName> 
    <Tag>Value</Tag> 
    ... 
</Move> 
+0

Bất kể câu trả lời hiện tại là gì, _how_ bạn có đang theo dõi nó không? Ví dụ, nếu bạn sử dụng 'XmlSerializer', nó sẽ hoạt động. (mặc dù bạn có thể phải sử dụng một số thuộc tính hoặc sáng tạo đặc biệt để có được kết quả lược đồ XML cụ thể mà bạn muốn) –

+0

Tôi đang sử dụng XmlSerializer –

+1

Bạn muốn lược đồ này như thế nào? Có vẻ như một chút mơ hồ về cách bạn xử lý nhiều thẻ. Có phải là ' tên Giá trị1 Giá trị2 ... Giá trịN '? Ngoài ra, bạn có linh hoạt với việc thay đổi các lớp 'Move' và' Tag' của mình không? –

Trả lời

9

Vâng, sử dụng t anh ta XmlSerializer nó sẽ tuần tự hóa List<T> miễn là T (hoặc trong trường hợp của bạn Tag) có thể được tuần tự hóa.

Move move = new Move { MoveName = "MyName" }; 
move.oTags.Add(new Tag { TagName = "Value1" }); 
move.oTags.Add(new Tag { TagName = "Value2" }); 
move.oTags.Add(new Tag { TagName = "Value3" }); 

StringBuilder output = new StringBuilder(); 
var writer = new StringWriter(output); 

XmlSerializer serializer = new XmlSerializer(typeof(Move)); 
serializer.Serialize(writer, move); 

Console.WriteLine(output.ToString()); 

này kết quả đầu ra sử dụng cấu trúc lớp hiện tại của bạn như:

<?xml version="1.0" encoding="utf-16"?> 
<Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <oTags> 
    <Tag> 
     <TagName>Value1</TagName> 
    </Tag> 
    <Tag> 
     <TagName>Value2</TagName> 
    </Tag> 
    <Tag> 
     <TagName>Value3</TagName> 
    </Tag> 
    </oTags> 
    <MoveName>MyName</MoveName> 
</Move> 

tôi sẽ xem liệu tôi có thể tìm thấy một cách để phù hợp với lược đồ XML hiện tại của bạn, nhưng bạn có thể tra cứu làm thế nào để áp dụng XmlAttributes và chơi xung quanh với nó cho mình.


EDIT:

Nếu bạn thay đổi khai báo lớp bạn để sử dụng XmlAttributes sau đây, bạn sẽ đạt được các lược đồ XML chính xác như trong ví dụ của bạn:

public class Move 
{ 
    [XmlElement(Order = 1)] 
    public string MoveName {get; set;} 

    [XmlElement(Order = 2, ElementName = "Tags")] 
    public List<Tag> oTags = new List<Tag>(); 
} 

public class Tag 
{ 
    [XmlText] 
    public string TagName {get; set;} 
} 

nào khi tuần tự sẽ tạo ra:

<?xml version="1.0" encoding="utf-16"?> 
<Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MoveName>MyName</MoveName> 
    <Tags>Value1</Tags> 
    <Tags>Value2</Tags> 
    <Tags>Value3</Tags> 
</Move> 
+0

Mặc dù không khớp với những gì tôi đang tìm kiếm chương trình khôn ngoan nó trả lời câu hỏi của tôi cho dù nó sẽ đào qua danh sách trong đối tượng của tôi . Liên kết Brendan Hill đăng cho tôi một ý tưởng khá hay về cách thiết lập bố cục cho bố cục tôi muốn. Cảm ơn bạn. –

+0

@maxinfet: Kiểm tra chỉnh sửa/cập nhật của tôi, tôi đã tìm thấy một tập hợp các thuộc tính sẽ tạo ra một kết quả phù hợp với lược đồ của bạn. –

+0

@ maxinfet: Ngoài ra, tôi đã làm hỏng mã tuần tự hóa của mình một chút, vì vậy có thể kiểm tra lại nếu bạn đã sao chép/dán mã đó. –

3

Bạn có chắc chắn rằng khai báo lớp học của bạn là đúng trong câu hỏi của bạn? bạn chỉ là tuyên bố Public Move, Cần Public class Move

Hãy thử mã này

XmlSerializer serializer = new XmlSerializer(typeof(YourClass)); 

Trong trường hợp của bạn

Move m = new Move(); 
      m.oTags.Add(new Tag() { TagName = "X" }); 
      m.oTags.Add(new Tag() { TagName = "XX" }); 

      XmlSerializer x = new XmlSerializer(typeof(Move)); 
      System.IO.Stream s; 

      var xmlwriter = System.Xml.XmlWriter.Create("C:\\MXL.txt"); 
      x.Serialize(xmlwriter, m); 

Output

<?xml version="1.0" encoding="utf-8"?> 
    <Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <oTags> 
<Tag> 
    <TagName>X</TagName> 
</Tag> 
<Tag> 
    <TagName>XX</TagName> 
</Tag> 
</oTags></Move> 
Các vấn đề liên quan