【问题标题】:How to Deserialize an xml element with only attributes in C#?如何反序列化 C# 中只有属性的 xml 元素?
【发布时间】:2016-06-23 15:31:36
【问题描述】:

我正在使用 System.Xml.Serialization.XmlSerializer 类。我需要在 C# 中反序列化以下 XML:

<message from="abc" to="xyz" xml:lang="en" id="Vx4Ix-14" type="chat">
   <received xmlns="urn:xmpp:receipts" id="9beea4d7-aa1e-4f3c-929c-712b56164b63"/>
</message>

下面是我的类来反序列化它:

[XmlRoot(ElementName = "message")]
public class Message
  {
    [XmlAttribute(AttributeName = "type")]
    public string Type { get; set; }

    [XmlAttribute(AttributeName = "from")]
    public string From { get; set; }

    [XmlAttribute(AttributeName = "to")]
    public string To { get; set; }

    [XmlAttribute(AttributeName = "id")]
    public string Id { get; set; }

    [XmlAttribute(AttributeName = "xml:lang")]
    public string Language { get; set; }

    [XmlElement(ElementName = "received", Namespace = "urn:xmpp:receipts")]
    public Received Received { get; set; } 
}

public class Received
{
    [XmlAttribute(AttributeName = "id")]
    public string Id { get; set; }
}

“received”xml 元素只有属性,我希望反序列化该元素以获取该元素的“id”值。 但是当我使用上面的类进行 Deserialize 时,我得到了除“received”xml 元素的“id”属性值之外的所有值。我将 Received 属性的值为 null。

请让我知道我的班级出了什么问题?

这是我的反序列化方法:

   public static T Deserialize<T>(string xml)
    {
        T deserializedObject = default(T);
        try
        {

            var serializer = new XmlSerializer(typeof(T));
            using (var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
            {
                deserializedObject = (T)serializer.Deserialize(memoryStream);
            }
            return deserializedObject;
        }
        catch (Exception)
        {
            return deserializedObject;
        }
    }

【问题讨论】:

  • 我在一个简单的 VS2015 控制台应用程序(不是 windows phone)中测试了你的类,它运行良好。你的反序列化代码是什么样子的?
  • 我已经用我使用的反序列化方法更新了这个问题。你是对的,我的方法有问题。控制台应用程序运行良好。
  • 我刚刚尝试了您的“反序列化”方法,并且在控制台应用程序中也可以正常工作。你能展示你用来调用“反序列化”的代码吗?
  • XMLSerializer.Deserialize(strXML)。我就是这样用的。
  • 我弄错了。在使用 [XmlElement(ElementName = "received", Namespace = "urn:xmpp:receipts")] 在 "Message" 类中定义 "Received" 属性时,我在 "xmpp" ("urn: xmpp:receipts)。由于额外的空间序列化程序无法正确反序列化它。但是在发布问题时,我以某种方式删除了该空间。非常感谢您的回复。

标签: c# xml windows windows-phone-8


【解决方案1】:

你的课看起来不错,也适合我。也许您没有正确使用反序列化器!?我用你的 XML 成功地尝试了它:

var serializer = new XmlSerializer(typeof(Message));
var message = (Message)serializer.Deserialize(
    new FileStream(@"C:\Users\homann.k\Desktop\test.xml", FileMode.Open, FileAccess.Read));

【讨论】:

  • 我已经用我使用的反序列化方法更新了这个问题。你能检查一下它有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多