Как разобрать XML с несколькими атрибутами и списком опций - PullRequest
1 голос
/ 14 февраля 2020

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

<root>
    <data label="product data" min="0" max="10">
        <option>
            <id>1</id>
            <name>Name1</name>
        </option>
        <option>
            <id>2</id>
            <name>Name2</name>
        </option>
        <option>
            <id>3</id>
            <name>Name3</name>
        </option>
    </data>
</root>

Мне нужно получить оба атрибута data и список опций.

Я пробовал это:

[XmlRoot(ElementName = "root")]
public class Data
{
    // Retreive data attributes
    [XmlElement(ElementName = "data")]
    public Options Attributes { get; set; }

    // Retrieve option list
    [XmlArray("data")]
    [XmlArrayItem("option", Type = typeof(GeneralOptions))]
    public GeneralOptions[] Options { get; set; }
}

Дополнительные классы:

Опции

public class Options
{
    [XmlAttribute("label")]
    public string Label{ get; set; }

    [XmlAttribute("min")]
    public string Min{ get; set; }

    [XmlAttribute("max")]
    public string Max{ get; set; }
}

GeneralOptions

public class GeneralOptions
{
    [XmlElement(ElementName = "id")]
    public string Id { get; set; }

    [XmlElement(ElementName = "name")]
    public string Name{ get; set; }
}

Но когда я пытаюсь десериализовать объект, он запускает следующее исключение:

Элемент XML 'data' из пространства имен '' уже присутствует в текущей области. Используйте атрибуты XML, чтобы указать другое XML имя или пространство имен для элемента.

Я думаю, проблема в том, что я пытаюсь получить один и тот же элемент "дважды". Но мне нужно вернуть обе вещи. Я не могу использовать [Attribute], потому что есть несколько атрибутов для извлечения, и мне нужно сделать это с несколькими XML элементами с одинаковым форматом, и я хочу использовать его повторно.

Итак, как мне вернуть их обоих?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2020

Вам нужно будет немного перестроить его:

[XmlRoot("root")]
public class Data
{
    [XmlElement("data")]
    public OptionsData Options { get; set; }
}

public class OptionsData
{
    [XmlAttribute("label")]
    public string Label { get; set; }

    [XmlAttribute("min")]
    public string Min { get; set; }

    [XmlAttribute("max")]
    public string Max { get; set; }

    [XmlElement("option")]
    public List<GeneralOptions> Items { get; } = new List<GeneralOptions>();
}

public class GeneralOptions
{
    [XmlElement("id")]
    public string Id { get; set; }

    [XmlElement("name")]
    public string Name { get; set; }
}
0 голосов
/ 14 февраля 2020

Я предлагаю использовать xmltocsharp или любые другие инструменты для преобразования моделей XML в C# в течение нескольких секунд ... (устраняет все ошибки вручную)

Как уже упоминалось @ canton7, другой простой метод - использование Visual Studio: Edit -> Paste Special -> Paste XML As Classes

[XmlRoot(ElementName="option")]
public class Option {
    [XmlElement(ElementName="id")]
    public string Id { get; set; }
    [XmlElement(ElementName="name")]
    public string Name { get; set; }
}

[XmlRoot(ElementName="data")]
public class Data {
    [XmlElement(ElementName="option")]
    public List<Option> Option { get; set; }
    [XmlAttribute(AttributeName="label")]
    public string Label { get; set; }
    [XmlAttribute(AttributeName="min")]
    public string Min { get; set; }
    [XmlAttribute(AttributeName="max")]
    public string Max { get; set; }
}

[XmlRoot(ElementName="root")]
public class Root {
    [XmlElement(ElementName="data")]
    public Data Data { get; set; }
}
...