Я намагаюся інтегруватися з третьою стороною 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