将键/值xml反序列化为对象

时间:2016-04-01 15:15:10

标签: c# .net xml

在以最有效/最干净的方式将以下xml反序列化为对象时遇到一些困难:

<item xsi:type="ns2:Map" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <item>
        <key xsi:type="xsd:string">mailinglistid</key> 
        <value xsi:type="xsd:string">1</value> 
    </item>
    <item>
        <key xsi:type="xsd:string">uniqueid</key> 
        <value xsi:type="xsd:string">1a0d0d2195</value> 
    </item>
    <item>
        <key xsi:type="xsd:string">name</key> 
        <value xsi:type="xsd:string">OSM NL</value> 
    </item>
</item>

这是一个单独的项目及其属性。如您所见,属性被定义为键/值对。

因为它们是键值对,所以无法找到使用Xml反序列化属性的方法(如本问题中所述:How to deserialize xml to object

因此我创建了以下替代方案:

// Retrieves all the elements from the "return" node in the Mailinglist_allResponse node.
var items = response.ResponseFromServer.Descendants(_engineResponseNamespace + "Mailinglist_allResponse").Descendants("return").Elements();

foreach (var item in items)
{
    var values = item.Descendants("item").ToArray();

    var list = new EngineMailingList
    {
        MailingListId =
            values.Descendants("key")
                .First(v => v.Value == "mailinglistid")
                .ElementsAfterSelf("value")
                .First()
                .Value,
        UniqueId =
            values.Descendants("key")
                .First(v => v.Value == "uniqueid")
                .ElementsAfterSelf("value")
                .First()
                .Value,
        Name =
            values.Descendants("key")
                .First(v => v.Value == "name")
                .ElementsAfterSelf("value")
                .First()
                .Value,
    };

    result.Add(list);

正如您所看到的,这比使用deserialize属性的代码多得多。有什么方法我仍然可以使用这些属性,以便我的代码可以更清洁/高效?否则,我将不得不做出很多这些功能。

1 个答案:

答案 0 :(得分:1)

我认为属性不会因键/值结构而起作用。程序无法单独从xml推断对象具有哪些属性。我会创建一个静态扩展方法辅助函数来获取值:

public static string GetValue(this XElement element, string key){
       return values.Descendants("key")
                    .First(v => v.Value == key)
                    .ElementsAfterSelf("value")
                    .First()
                    .Value;
    }

这样您的代码可能如下所示:

MailingListId = values.GetValue("mailinglistid"),
UniqueId = values.GetValue("uniqueid"),
Name = values.GetValue("name")