Пытаюсь распарсить простенький 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. Для вас создастся валидный, хотя и неоптимальный набор классов, которые уже можно упрощать.
Комментариев нет:
Отправить комментарий