如何反序列化 C# 中只有属性的 xml 元素?

Posted

技术标签:

【中文标题】如何反序列化 C# 中只有属性的 xml 元素?【英文标题】:How to Deserialize an xml element with only attributes in C#? 【发布时间】: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)。由于额外的空间序列化程序无法正确反序列化它。但是在发布问题时,我以某种方式删除了该空间。非常感谢您的回复。 【参考方案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));

【讨论】:

我已经用我使用的反序列化方法更新了这个问题。你能检查一下它有什么问题吗?

以上是关于如何反序列化 C# 中只有属性的 xml 元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 xml 元素值反序列化为 C# 类属性

在 C# 中反序列化 XML 元素的存在以布尔

C# xml 反序列化不会将子元素提取到列表中

如何在 C# 中反序列化具有属性的 XML [重复]

如何在将 xml 反序列化为 c# 对象时获取单个 xml 元素的多个值?

在C#中序列化和反序列化之间保留xml元素的顺序