Используйте несколько пространств имен при десериализации с .NET XmlSerializer - PullRequest
0 голосов
/ 17 сентября 2009

Я пытаюсь десериализовать XML с двумя пространствами имен, как это

<records xmlns="http://www.foo.com/xml/records/1.1">
    <record xmlns="http://www.foo.com/xml/record/1.1">

и иногда более старая версия

<records xmlns="http://www.foo.com/xml/records/1.1">
    <record xmlns="http://www.foo.com/xml/record/1.0">

Мой класс Records.cs имеет

[XmlRoot(ElementName = "records", Namespace = "http://www.foo.com/xml/records/1.1")]
public class Records
{
    [System.Xml.Serialization.XmlElementAttribute("record")]
    public List<Record> Records { get; set; }
}

Я хочу, чтобы список записей мог содержать запись версии 1.0 или версии

/// <remarks/>
[XmlRoot(IsNullable = false, ElementName = "record", Namespace = "http://www.foo.com/xml/record/1.0")]
public partial class Record
{


    /// <remarks/>

    public Record()
    {

    }
}

/// <remarks/>
[XmlRoot(IsNullable = false, ElementName = "record", Namespace = "http://www.foo.com/xml/record/1.1")]
public partial class Record11 : Record
{
    /// <remarks/>
    public Record11()
    {
    }
}

поэтому я предположил, что подклассы записи будут работать.

Я получаю исключение Reflection при десериализации, и оно указывает мне на атрибут XmlChoiceIdentifier. Однако это похоже на перечисления.

Кто-нибудь знает, как делать то, что я хочу (поддерживает десериализацию нескольких версий одной и той же схемы?)

Спасибо.

1 Ответ

9 голосов
/ 17 сентября 2009
Атрибуты

[XmlRoot] для Record и Record11 в вашем примере будут игнорироваться. Они имеют смысл только тогда, когда элемент является корнем в дереве. Что вам, скорее всего, нужно сделать, это:

[XmlRoot(ElementName = "records",
         Namespace = "http://www.foo.com/xml/records/1.1")]
public class Records
{
    [XmlElement(Type = typeof(Record),
                ElementName = "record",
                Namespace = "http://www.foo.com/xml/records/1.0")]
    [XmlElement(Type = typeof(Record11),
                ElementName = "record",
                Namespace = "http://www.foo.com/xml/records/1.1")]
    public List<Record> Records { get; set; }
}
...