как я десериализую этот xml?

Мне нужно десериализовать xml ниже. Я хочу использовать xmlserializer, потому что я (более) знаком с ним. Я считаю, что этот xml не построен правильно, но я не могу его изменить. Ниже представлен список объектов категории. Когда я пытаюсь десериализовать, используя

xmlserializer(typeof(List))

Я получаю эту ошибку: «Категорий xmlns = '' не ожидается"

<?xml version="1.0" encoding="utf-8" ?>

  
  
  
  
  

Я не возражаю сделать какой-то фиктивный класс, чтобы уничтожить их, если это то, что я должен сделать. Вот мой класс категорий

[XmlType("category")]
 public class Category
 {


    [XmlAttribute("id")]
    public int ID { get; set; }

    [XmlAttribute("parent_id")]
    public int ParentID { get; set; }

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

Мой код:

    XmlSerializer serializer = new XmlSerializer(typeof(List));
    StringReader reader = new StringReader(xml);
    List obj = null;

    using (System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(reader))
    {
        obj = (List)serializer.Deserialize(xmlReader);
    }
        return obj;
1
nl ja de
Я думаю, вам нужно указать, что «категории» - это список «категории».
добавлено автор Edwin de Koning, источник
Думаю, вам нужно указать пространство имен по умолчанию для сериализатора. Смотрите: stackoverflow.com/questions/2500111/…
добавлено автор Erno de Weerd, источник
Я считаю, что XmlSerializer нуждается в конструкторе по умолчанию, см. stackoverflow.com/a/267727/1380061
добавлено автор Fredrik, источник

3 ответы

Try to make a categories class that will contain your List like this:

[XmlRoot("categories")]
public class Categories
{
    public Categories() 
    {
       Items = new List();
    }

    [XmlElement("category")]
    public List Items {get;set;}
}

Вы можете создать сериализатор следующим образом:

XmlSerializer serializer = new XmlSerializer(typeof(Categories));
1
добавлено

Вы можете просто передать XmlRootAttribute в сериализатор для части «категории».

BUT... you must remove the "&" from your xml because its not valid

XmlSerializer serializer = new XmlSerializer(typeof(List), new XmlRootAttribute("categories"));

using (FileStream fileStream = new FileStream(@"C:\Test.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    var test = serializer.Deserialize(fileStream);
}

enter image description here

Here is your method working with a String.Replace to sort out the "&"

    private List GetCategories(string xmlData)
    {
        List obj = null;
        XmlSerializer serializer = new XmlSerializer(typeof(List), new XmlRootAttribute("categories"));
        StringReader reader = new StringReader(xmlData.Replace("&","&"));
        using (System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(reader))
        {
            obj = (List)serializer.Deserialize(xmlReader);
        }
        return obj;
    }
1
добавлено
Блестяще, спасибо вам большое !!!
добавлено автор Sam, источник

У вас есть XSD, которому должен соответствовать этот XML? Если это так, вы можете сгенерировать требуемый код, используя: "xsd your.xsd/classes"

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot