簡體   English   中英

使用XmlSerializer重命名平面xml數組中的數組項

[英]Renaming array items in a flat xml array using an XmlSerializer

我有一個具有以下格式的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <Item Property1="A" Property2="B" />
    <Item Property1="C" Property2="D" />
</Items>

我需要使用XmlSerializer將<Item>元素讀取為MyClass類的對象。

public class MyCLass
{
    [XmlAttribute]
    public string Property1 { get; set; }

    [XmlAttribute]
    public string Property2 { get; set; }
}

當前,我具有以下代碼來讀取文件:

XmlSerializer serializer =
    new XmlSerializer(typeof(MyClass[]), new XmlRootAttribute(@"Items"));

MyClass[] list = (MyClass[])serializer.Deserialize(...);

由於元素名稱<Item>與類名稱MyCLass不同,因此數組中的元素完全不會反序列化。 如果我將MyClass重命名為Item ,則上面的代碼有效,但不幸的是,我不允許更改XML文件或類名。

我該如何映射兩者,以便可以正確讀取文件?

提前致謝!

使用包含數組的包裝器類,這將允許您應用XmlElement屬性:

public class MyClassList
{
    [XmlElement("Item")]
    public MyClass[] Items { get; set; }
}

var items = new[]
{
    new MyClass { Property1 = "A", Property2 = "B" },
    new MyClass { Property1 = "C", Property2 = "D" },
};
var list = new MyClassList { Items = items };

using (var writer = new StringWriter())
{
    var xs = new XmlSerializer(typeof(MyClassList), new XmlRootAttribute("Items"));
    xs.Serialize(writer, list);
    writer.ToString().Dump();
}

就我個人而言,我將手動進行序列化和反序列化-我發現,以這種方式獲得所需的任何靈活性都比花很長時間弄亂內置序列化並承受其施加的各種限制要容易得多。 LINQ to XML使其非常簡單。 例如,在這種情況下:

XDocument doc = XDocument.Load("test.xml");
// You could use an array if you really wanted, of course.
List<MyClass> list = doc.Root
                        .Elements("Item")
                        .Select(x => new MyClass {
                            Property1 = (string) x.Attribute("Property1"),
                            Property2 = (string) x.Attribute("Property2"),
                         })
                        .ToList();

誠然,如果您需要序列化具有復雜關系的對象(兩個對象指向同一個孩子或其他對象),這將變得很繁瑣,但是我在過去已經取得了很大的成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM