将xml xmpp消息反序列化为对象

时间:2015-07-21 11:30:54

标签: c# xml xmpp deserialization

我正在尝试将xml字符串反序列化为c#对象。这是消息:

<message from='test1@localhost' to='test2@localhost'><result xmlns='urn:xmpp:mam:tmp' id='A6QV1I4TKO81'><forwarded xmlns='urn:xmpp:forward:0'><delay xmlns='urn:xmpp:delay' from='test1@localhost' 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; }
}

这是反序列化的代码:

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

对象属性“from”和“to”很好,但“Result”返回null。我无法理解我在这里缺少的东西......

1 个答案:

答案 0 :(得分: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; }
}