Понимание значения корневого элемента в десериализации xml - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть XML, подобный следующему:

<feed>
  <products>
    <product>
    </product>
    .
    .
    .
    <product>
    </product>
  </products>
</feed>

Я могу десериализовать xml, используя:

public class feed
{
    public ProductList products { get; set; }
}

public class ProductList
{
    [XmlElement("product")]
    public List<Product> Products { get; set; }
}

var result = (feed)new XmlSerializer(typeof(feed)).Deserialize(xmlReader);

Я думал, что могу использовать корневой атрибут XML для управления десериализацией, т.е.

class Products
{
   public List<Product> Products { get; set; }
}

var rootAtrr = new XmlRootAttribute("products");
var result = (Products)new XmlSerializer(typeof(Products), rootAtrr).Deserialize(xmlReader);

или еще лучше:

var result = (List<Product>)new XmlSerializer(typeof(List<Product>), rootAtrr).Deserialize(xmlReader);

Все вышеперечисленные изменения не работают.

Означает ли это, что корневой атрибут предназначен специально для корневого элемента ACTUAL вXML не с чего начать чтение?

Кроме того, означает ли это, что документ XML предписывает, какой класс модели определить?класс feed в данном конкретном случае?

Или я пропускаю точку или 3?

1 Ответ

0 голосов
/ 04 декабря 2018

«Корневой элемент» в жаргоне XML означает элемент верхнего уровня документа XML.XmlRootAttribute указывает XmlSerializer, как ваш класс отображается в / из корневого элемента документа XML.

Если, например, корневой элемент XML должен иметь имя тега feed, но вывы бы предпочли, чтобы ваш класс назывался SerializedFeed, вы могли бы использовать XmlRootAttribute, например:

[XmlRoot("feed")]
public class SerializedFeed
{
    [XmlArray("products")]
    [XmlArrayItem("product")]
    public List<Product> products { get; set; }
}

public class Product {
    [XmlAttribute("name")]
    public string Name {get; set;}
}

и читать XML следующим образом:

var xml = @"<feed>
  <products>
    <product name=""A"" />
    <product name=""B"" />    
  </products>
</feed>";
var serializer = new XmlSerializer(typeof(SerializedFeed)); 
var feed = (SerializedFeed)serializer.Deserialize(new StringReader(xml));

При использовании XmlSerializer, ваша иерархия классов должна соответствовать документу XML.Если этого не произойдет, по моему опыту, вы будете бороться с фреймворком на каждом шагу, и было бы проще написать свой собственный сериализатор / десериализатор, используя XmlReader / XmlWriter API.

...