C # десериализация XML в массив с одноуровневыми узлами - PullRequest
1 голос
/ 26 октября 2011

В проекте, над которым я работаю, мне дали XML для работы, который я не могу контролировать. Мне нужно вытащить массив узлов, а также единственное свойство, которое является родственным элементом массива. (См. Образец XML ниже)

<pagination>
    <total-pages>1</total-pages>
    <page position="first">?i=1;q=gloves</page>
    <page position="last">?i=1;q=gloves</page>
    <page position="1" selected="true">?i=1;q=gloves</page>      
</pagination>

В приведенном выше примере мне нужно извлечь узел total-pages в виде int и создать массив узлов страницы. У меня есть основы работы десериализатора, мне просто нужно знать, как настроить мой класс, чтобы я мог извлекать массив и int. Если я делаю следующее в моем основном классе:

[XmlArray("pagination")]
[XmlArrayItem("page", typeof(ResultsPage))]
public ResultsPage[] Pages { get; set; }
[XmlElement(ElementName = "total-pages")]
public int TotalPages { get; set; }

Я получаю массив узлов страницы, но TotalPages равно 0, а не 1. Я также попробовал следующее в своем основном классе:

[XmlElement(ElementName = "pagination")]
public Pagination Pagination { get; set; }

с подклассом

public class Pagination
{
    [XmlArray]
    [XmlArrayItem("page", typeof(ResultsPage))]
    public ResultsPage[] Pages { get; set; }
    [XmlElement(ElementName = "total-pages")]
    public int TotalPages { get; set; }
}

В этом случае для TotalPages правильно задано значение 1, но массив страниц равен нулю.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 26 октября 2011

Это должно работать

public class Pagination
{
    [XmlElement("page")]
    public List<ResultsPage> Pages { get; set; }
    [XmlElement("total-pages")]
    public int TotalPages { get; set; }
}

public class ResultsPage
{
    [XmlAttribute("position")]
    public string Position;

    [XmlText]
    public string Text;
}

Вам необходимо использовать атрибуты XmlArray и XmlArrayItem только в том случае, если у вас есть элемент контейнера, который вы хотите сгладить. * Т.е. 1004 *

<pagination>
    <total-pages>1</total-pages>
    <pages>
        <page position="first">?i=1;q=gloves</page>
        <page position="last">?i=1;q=gloves</page>
        <page position="1" selected="true">?i=1;q=gloves</page>      
    </pages>
</pagination>

Тогда ты будешь писать

public class Pagination
{
    [XmlArray("pages"), XmlArrayItem("page")]
    public List<ResultsPage> Pages { get; set; }
    [XmlElement("total-pages")]
    public int TotalPages { get; set; }
}
...