2015-07-21 5 views
0

Я пытаюсь десериализовать XML-строку для объекта C#. Это сообщение:Deserialize xml xmpp message to object

<message from='[email protected]' to='[email protected]'><result xmlns='urn:xmpp:mam:tmp' id='A6QV1I4TKO81'><forwarded xmlns='urn:xmpp:forward:0'><delay xmlns='urn:xmpp:delay' from='[email protected]' stamp='2015-07-21T09:12:09Z'></delay><message type='mchat'><subject/><body/></message></forwarded></result></message> 

И это класс

public class Delay { 
    [XmlAttribute(AttributeName="xmlns")] 
    public string Xmlns { get; set; } 
    [XmlAttribute(AttributeName="from")] 
    public string From { get; set; } 
    [XmlAttribute(AttributeName="stamp")] 
    public string Stamp { get; set; } 
} 

public class Active { 
    [XmlAttribute(AttributeName="xmlns")] 
    public string Xmlns { get; set; } 
} 

public class XmppMessage { 
    [XmlElement(ElementName="body")] 
    public string Body { get; set; } 
    [XmlAttribute(AttributeName="lang")] 
    public string Lang { get; set; } 
    [XmlAttribute(AttributeName="type")] 
    public string Type { get; set; } 
    [XmlAttribute(AttributeName="id")] 
    public string Id { get; set; } 
    [XmlAttribute(AttributeName="to")] 
    public string To { get; set; } 
} 

public class Forwarded { 
    [XmlElement(ElementName="delay")] 
    public Delay Delay { get; set; } 
    [XmlElement(ElementName="message")] 
    public XmppMessage Message { get; set; } 
    [XmlAttribute(AttributeName="xmlns")] 
    public string Xmlns { get; set; } 
} 

public class Result { 
    [XmlElement(ElementName="forwarded")] 
    public Forwarded Forwarded { get; set; } 
    [XmlAttribute(AttributeName="xmlns")] 
    public string Xmlns { get; set; } 
    [XmlAttribute(AttributeName="id")] 
    public string Id { get; set; } 
} 

[XmlRoot(ElementName="message")] 
public class MessageHistory { 
    [XmlElement(ElementName="result")] 
    public Result Result { get; set; } 
    [XmlAttribute(AttributeName="from")] 
    public string From { get; set; } 
    [XmlAttribute(AttributeName="to")] 
    public string To { get; set; } 
} 

Это код deserialise:

MessageHistory messageNode;    
XmlSerializer serializer = new XmlSerializer(typeof(MessageHistory)); 
using (StringReader reader = new StringReader(message)) 
        { 
         messageNode = (MessageHistory)(serializer.Deserialize(reader)); 
        } 

Объект недвижимости "от" и "до" отлично но «Результат» возвращает null. Я не могу понять, что мне здесь не хватает ...

+0

Добавьте [XmlRoot (ElementName = "..")] ко всем классам. Имя чувствительно к регистру, поэтому у вас есть имя класса «Переадресовано» и имя тега «переадресовано». Добавление XmlRoot позволит тегу быть нижним регистром, а имя класса - upppercase. – jdweng

+0

XmlRoot на классе MessageHistory было достаточно, проблема была в пространствах имен ... спасибо вам все равно – nhenrique

ответ

2

Проблема заключается в пространствах имен в XML. вы должны явно указать пространства имен, например:

public class Forwarded 
{ 
    [XmlElement(ElementName = "delay", Namespace = "urn:xmpp:delay")] 
    public Delay Delay { get; set; } 
    [XmlElement(ElementName = "message")] 
    public XmppMessage Message { get; set; } 
    [XmlAttribute(AttributeName = "xmlns")] 
    public string Xmlns { get; set; } 
} 

public class Result 
{ 
    [XmlElement(ElementName = "forwarded", Namespace = "urn:xmpp:forward:0")] 
    public Forwarded Forwarded { get; set; } 
    [XmlAttribute(AttributeName = "xmlns")] 
    public string Xmlns { get; set; } 
    [XmlAttribute(AttributeName = "id")] 
    public string Id { get; set; } 
} 

[XmlRoot(ElementName = "message")] 
public class MessageHistory 
{ 
    [XmlElement(ElementName = "result", Namespace = "urn:xmpp:mam:tmp")] 
    public Result Result { get; set; } 
    [XmlAttribute(AttributeName = "from")] 
    public string From { get; set; } 
    [XmlAttribute(AttributeName = "to")] 
    public string To { get; set; } 
} 
+0

он работает сейчас! Большое спасибо! Я понятия не имел, что пространства имен требуются: / – nhenrique