2010-03-19 46 views
5

Hãy xem xét các lớp serializable sau:.net serialization XML: làm thế nào để xác định phần tử gốc và phần tử con tên của một mảng

class Item {...} 
class Items : List<Item> {...} 
class MyClass 
{ 
    public string Name {get;set;} 
    public Items MyItems {get;set;} 
} 

Tôi muốn đầu ra tuần tự để trông giống như:

<MyClass> 
    <Name>string</Name> 
    <ItemValues> 
     <ItemValue></ItemValue> 
     <ItemValue></ItemValue> 
     <ItemValue></ItemValue> 
    </ItemValues> 
</MyClass> 

Thông báo các Tên phần tử ItemValues ​​và ItemValue không khớp với tên lớp Item và Items, giả sử tôi không thể thay đổi Item hoặc Item class, có bất kỳ lý do gì để chỉ định tên phần tử mà tôi muốn, bằng cách sửa đổi MyClass Class?

+0

Những loại serialization? 'XmlSerializer'? 'DataContractSerializer'? –

+0

@John - XmlSerializer – Jeremy

Trả lời

6
public class MyClass 
{ 
    public string Name {get;set;} 
    [XmlArray("ItemValues")] 
    [XmlArrayItem("ItemValue")] 
    public Items MyItems {get;set;} 
} 
1

Bạn có thể muốn nhìn vào "How to: Specify an Alternate Element Name for an XML Stream"

bài viết đó thảo luận về việc sử dụng 's ElementNameXmlElementAttribute để thực hiện điều này.

+0

Vui lòng không đăng liên kết .NET 1.1. Người nào đó nhấp vào liên kết đó và không thông báo sau đó sẽ nhấp vào các liên kết trong tài liệu và được dẫn đến nhiều thông tin cũ hơn. –

+0

Thực ra, '[XmlElement]' sẽ không trợ giúp ở đây; mà sẽ cho phép bạn làm ' chuỗi' (lưu ý không ' '), nhưng không phải những gì các câu hỏi yêu cầu. –

0

Bạn cũng có thể xem xét việc sử dụng LINQ to Xml để tạo XML của bạn từ lớp học. Một cái gì đó như

XElement element = new XElement(
    "MyClass", 
    new XElement("Name", myClass.Name), 
    new XElement(
     "ItemValues", 
     from item in myClass.Items 
     select new XElement(
      "ItemValue", 
      new XElement("Foo", item.Foo)))); 

Trong đó sẽ tạo

<MyClass> 
    <Name>Blah</Name> 
    <ItemValues> 
    <ItemValue> 
     <Foo>A</Foo> 
    </ItemValue> 
    <ItemValue> 
     <Foo>B</Foo> 
    </ItemValue> 
    </ItemValues> 
</MyClass> 
Các vấn đề liên quan