在以最有效/最干净的方式将以下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属性的代码多得多。有什么方法我仍然可以使用这些属性,以便我的代码可以更清洁/高效?否则,我将不得不做出很多这些功能。
答案 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")