/ / Десеріалізація XML до класу, коли ім'я властивості є атрибутом на кожному вузлі - c #, xml, xml-serialization, datacontractserializer, asp.net-web-api

Десеріалізація XML у класі, коли ім'я властивості є атрибутом на кожному вузлі - c #, xml, xml-serialization, datacontractserializer, asp.net-web-api

Я намагаюся інтегруватися з третьою стороною RESTAPI. Цей API завжди повертає всі його ресурси як тип активу та його властивості як тип атрибута. Він використовує атрибут на вузлах атрибутів для надання імені властивості. Xml читається так:

<Assets>
<Asset>
<Attribute name="AssetType">Story</Attribute>
<Attribute name="OwnerName">Fred Blogs</Attribute>
<Attribute name="Name">The Lord of the Rings</Attribute>
...
</Asset>
...
</Assets>

Я хотів би використовувати DataContractSerializer (або, можливо, XmlSerializer?), Щоб перетворити його на список pocos типу Story.

[DataContract(Name="Asset")]
public class Story
{
public string OwnerName { get; set; }
public string Name { get; set; }
}

Атрибут DataMember працює на назву вузла, а не на значення атрибута вузлів, наскільки я можу сказати. Чи є спосіб обійти це?

Я б хотів, щоб клієнт WebAPI читав як такий.

    var client = new HttpClient();
var result = client.GetAsync(uri).Result;
var stories = r.Content.ReadAsAsync<List<Story>>().Result;

Відповіді:

1 для відповіді № 1

Як щодо розбору з Linq2Xml?

XDocument xDoc = XDocument.Parse(xml);
var assets = xDoc.Descendants("Asset")
.Select(a=>a.Descendants("Attribute")
.ToDictionary(x => x.Attribute("name").Value,
x => x.Value))
.ToList();

1 для відповіді № 2

Щоб досягти цього, вам доведеться написати спеціальний серіалізатор. Докладніше див. Тут:

http://msdn.microsoft.com/en-us/library/ty01x675(v=vs.80).aspx