Страницы

Поиск по вопросам

среда, 19 июня 2019 г.

Проблема с парсингом XML

Пытаюсь распарсить простенький xml-файл
- - - -
Соответственно сделал 3 класса:
Action
public class action { [XmlAttribute("type")] public String type; [XmlAttribute("title")] public String title; [XmlAttribute("screenUr1")] public String screenUrl; }
Category
public class category {
[XmlArray("category")] [XmlArrayItem("action")] public action[] category; [XmlAttribute("title")] public String title; [XmlAttribute("subtitle")] public String subtitle; [XmlAttribute("icon")] public String icon; }
CategoryContainer
[XmlRoot("root")]
public class CategoryContainer {
[XmlArray("content"), XmlArrayItem("category")] public category[] content;
public static CategoryContainer load(string path) { XmlSerializer serializer = new XmlSerializer(typeof(CategoryContainer)); FileStream stream = new FileStream(path, FileMode.Open); return serializer.Deserialize(stream) as CategoryContainer; }
}
Пока что для удобства все скидываю в String. Как можно заметить, получается что в классе category у меня также есть и массив с названием category. Если поменять имя класса, то в классе CategoryContainer перестает работать строка:
[XmlArray("content"), XmlArrayItem("category")] public category[] content;
Если же поменять имя массива, то соответственно перестает работать строка в классе category:
[XmlArray("category")] [XmlArrayItem("action")] public action[] category;
Есть ли какие-то варианты решения, используя именно XMLSerializer? Если нет, то как тогда лучше сделать?


Ответ

У меня работает так:
[XmlRoot("root")] public class CategoryContainer { [XmlArray("content")] [XmlArrayItem("category")] public Category[] Content { get; set; } }
public class Category { [XmlElement("action")] // <---------- public Action[] ActionList { get; set; }
[XmlAttribute] public string title { get; set; }
[XmlAttribute] public string icon { get; set; }
[XmlAttribute] public string subtitle { get; set; } }
public class Action { [XmlAttribute] public string title { get; set; }
[XmlAttribute] public string screenUrl { get; set; }
[XmlAttribute] public string type { get; set; } }
И я на вашем месте бы переименовал атрибуты:
[XmlAttribute("title")] public string Title { get; set; }
и т. д. А ещё оберните stream в using: using (var stream = File.OpenRead(path)) return ...

Совет: проще всего заставить Visual Studio сгенерировать правильные классы при помощи такого трюка: поместите XML в буфер, выберите Edit → Paste Special → Paste XML as classes. Для вас создастся валидный, хотя и неоптимальный набор классов, которые уже можно упрощать.

Комментариев нет:

Отправить комментарий