XmlSerializer не заполняет декорированную коллекцию XmlElementAttribute

Я пытаюсь десериализовать следующий xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<common:messages xmlns:xlink="http://www.w3.org/1999/xlink" 
                 xmlns:ns3="http://rest.immobilienscout24.de/schema/platform/gis/1.0" 
                 xmlns:common="http://rest.immobilienscout24.de/schema/common/1.0">
  <message>
    <messageCode>ERROR_DESCRIPTION</messageCode>
    <message>The request is not schema valid. [MESSAGE: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 3; cvc-complex-type.2.4.a: Invalid content was found starting with element 'external-Id'. One of '{externalId, title}' is expected.] </message>
  </message>
  <message>
      ...
  </message>
</common:messages>

в следующий экземпляр класса messages:

[XmlRoot("messages", Namespace = NS.Common)]
public partial class messages
{
    [XmlElementAttribute("message")]
    public List<Message> message { get; set;}
}

public partial class Message
{
    [XmlElement("messageCode", Namespace = NS.Common)]
    public MessageCode messageCode { get; set; }

    [XmlElement("message", Namespace = NS.Common)]
    public string message { get; set; }
}

[Serializable]
[XmlType(Namespace = NS.Common)]
public enum MessageCode
{
    ERROR_DESCRIPTION,
    RESOURCE_CREATED
}


public class NS
{
    public const string Common = "http://rest.immobilienscout24.de/schema/common/1.0";
}

public class XmlHelper
{
    public static T Deserialize<T>(string xml, Encoding encoding = null) where T : new()
    {
            if (xml == string.Empty)
                return new T();

            var serializer = new XmlSerializer(typeof(T));
            encoding = encoding ?? Encoding.UTF8;
            using (var stream = new MemoryStream(encoding.GetBytes(xml)))
                return (T)serializer.Deserialize(stream);
    }
}

Я не получаю ошибок от XmlSerializer, но коллекция сообщений всегда пуста.

У меня есть подозрение, что XmlSerializer не может правильно определить, что такое «сообщение» - элемент массива или элемент, содержащий строковое сообщение. Я не могу изменить структуру xml, поэтому я должен исправить свою процедуру десериализатора или некоторые атрибуты свойств xml.

Что не так с моим кодом? Любая помощь приветствуется.


person python_kaa    schedule 23.09.2013    source источник
comment
Я пытался заставить его работать, но не смог. Одна вещь, на которую я наткнулся, - это использование XmlElement вместо XmlElementAttribute для элементов сообщения (подробности см. Здесь: stackoverflow.com/questions/11731947/xml-serialization-of-list)   -  person meilke    schedule 23.09.2013
comment
Нет никакой разницы. Если у вас или базовой библиотеки .NET есть атрибут StrangeNamedAttribute, вы можете использовать его как [StrangeNamed] или [StrangeNamedAttribute]. И спасибо. Я знаю о подходе, описанном в ответе, на который вы ссылаетесь, и прочитал его и некоторые другие, прежде чем я опубликовал свой собственный вопрос.   -  person python_kaa    schedule 23.09.2013
comment
Вы абсолютно правы! Моя ошибка! Думаю, я был сбит с толку из-за атрибутов, используемых в C # и XML ...   -  person meilke    schedule 23.09.2013


Ответы (1)


Думаю, ваша проблема связана с пространствами имен. Поскольку сообщения кажутся единственным элементом, имеющим общее пространство имен, вы можете попытаться сбросить пространство имен для всех дочерних элементов. Что-то вроде этого :

[XmlRoot("messages", Namespace = NS.Common)]
public partial class messages
{
    [XmlElementAttribute("message", Namespace = "")]
    public List<Message> message { get; set;}
}

public partial class Message
{
    [XmlElement("messageCode", Namespace = "")]
    public MessageCode messageCode { get; set; }

    [XmlElement("message", Namespace = "")]
    public string message { get; set; }
}

[Serializable]
[XmlType(Namespace = "")]
public enum MessageCode
{
    ERROR_DESCRIPTION,
    RESOURCE_CREATED
}

или с Form = System.Xml.Schema.XmlSchemaForm.Unqualified

person jbl    schedule 23.09.2013
comment
Да, это сработало! Если я снова сериализую экземпляр, верхний <message> станет <message xmlns="">. Я также экспериментировал с Namespace = NS.Common, Form = XmlSchemaForm.Unqualified с точно сериализованными и десериализованными результатами. - person python_kaa; 23.09.2013
comment
@meilke хороший момент. Атрибуты String.Empty in не компилируются. Я заменил их пустыми струнами. Спасибо - person jbl; 23.09.2013
comment
@python_kaa спасибо за продолжение и альтернативное решение! +1 - person jbl; 23.09.2013