Сериализация пользовательского объекта в XML - PullRequest
3 голосов
/ 26 февраля 2009

Я пытаюсь создать класс, который можно сериализовать для создания следующего XML:

<chart palette='1'>
  <categories>
    <category label='2001' />
    <category label='2002' />

.. и т.д.

У меня есть класс, который выглядит примерно так:

[XmlRoot("chart")]
public class Chart
{        
    [XmlAttributeAttribute("palette")]
    public string Palette;

    [XmlElement("categories")]
    public List<Category> Categories = new List<Category>();
}

[XmlRoot("category")]
public class Category
{
    [XmlAttributeAttribute("label")]
    public string Label;
}

Однако это не приводит к желаемой структуре диаграммы-> категории-> категория @. XmlRoot в классе Category, похоже, не используется. Вот вывод, который я получил из этого кода:

 <chart palette="2">
  <categories label="2002" /> 
 </chart>

Как я могу получить желаемую структуру XML?

Ответы [ 4 ]

10 голосов
/ 26 февраля 2009

Использовать XmlArrayAttribute и XmlArrayItemAttribute

[XmlRoot("chart")]
public class Chart
{        
    [XmlAttributeAttribute("palette")]
    public string Palette;

    [XmlArray("categories")]
    [XmlArrayItem("category")]
    public List<Category> Categories = new List<Category>();
}


public class Category
{
    [XmlAttributeAttribute("label")]
    public string Label;
}

Иногда может быть полезно просто создать желаемую структуру xml, а затем использовать xsd.exe для генерации классов из нее. Это должно быть сделано в двухэтапном процессе, сначала создав файл xsd, а затем классы из этого.

xsd.exe something.xml
xsd.exe something.xsd /classes

Это, вероятно, не даст желаемого результата (если у вас действительно хороший xsd, и вы не просто сгенерируете его из xml), но он дает некоторые идеи

6 голосов
/ 26 февраля 2009

Должно быть:

[XmlRoot("chart")]
public class Chart
{        
    [XmlAttributeAttribute("palette")]
    public string Palette;

    [XmlArray("categories")]
    [XmlArrayItem("category")]
    public List<Category> Categories = new List<Category>();
}

[XmlRoot("category")]
public class Category
{
    [XmlAttribute("label")]
    public string Label;
}
1 голос
/ 06 августа 2009

У меня была похожая идея, и я решил написать собственный базовый класс для ее обработки. Проверьте мою запись на http://www.ideosity.com/ASP-NET/Object-to-XML-lab.aspx. Я думаю, что это заставит вас двигаться в правильном направлении.

0 голосов
/ 26 февраля 2009

Несмотря на то, что это для ASP.NET, эта ссылка может оказаться полезной

Сериализация XML в ASP.NET

Он говорит вам, как вы можете работать в обоих направлениях, когда дело доходит до сериализации.

Кроме того, не забудьте об инструменте xsd.exe, который вы можете использовать из командной строки , поставляемой с Visual Studio (я использовал .NET 2005)

Например, вы можете создать следующую схему, передав ей XML-файл

например. xsd yourfile.xml

Затем вы можете использовать сгенерированный xsd для создания класса сериализации, который по сути является объектной моделью XML с классом для каждого узла, передав схему в xsd

например. xsd yourfile.xsd / c / l: C

Опять же, это основано на .NET, поэтому извиняюсь, если это не представляет интереса для оригинального плаката.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...