微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 XML 属性将 XML 反序列化为 C# 对象

如何解决如何使用 XML 属性将 XML 反序列化为 C# 对象

至今一直与 Json 合作。 现在我得到一个 XML 作为数据源,我想使用 XML 属性将它反序列化为 C# 对象。 问题,正如我所见,我只想从 MSGData 序列化 XML - 所以我将 DOCUMENT 设置为 XmlRootAttribute。 目前没有错误 - 只是将属性设为 null。

这是我的 XML(我只需要具有正确属性的 C# 最少需要的类):

<?xml version="1.0" encoding="IBM862"?>
<DOCUMENT>
 <MSGData>
   <ITEMS>
    <ITEM>
      <ID>121</ID>
      <Name>test</Name>
    </ITEM>
    <ITEM>
     <ID>122</ID>
     <Name>test1</Name>
    </ITEM>
    <ITEM>
     <ID>122</ID>
     <Name>test1</Name>
    </ITEM>
  </ITEMS>
 </MSGData>
</DOCUMENT>

这就是我的课程的样子(忽略拼写错误 - 这不是复制+粘贴代码 - 它是自由文本):

<Xmlroot(ElementName="ITEM")]
public class Item
{
    [XmlElement(ElementName="ID"])
    public int ID {get; set;}
    [XmlElement(ElementName="Name"])
    public string Name {get; set;}
}

[Xmlroot(ElementName="ITEMS")]
public class Items
{
    [XmlElement(ElementName="ITEM"]) //I think that here I should use XmlArray (see below)
    //[XmlArray("ITEMS"]
    IEnumerable<Item> Items {get; set;}
}

[XmlRoot(ElementName="MSGData")]
public class MSGData
{
    [XmlElement(ElementName="ITEMS")]
    public Items itemsInstance {get; set;}
}

当我阅读 XML 时,我使用 XmlRootAttribute 开始收集 DOCUMENT 节点内的数据:

XmlRootAttribute xRoot = new XmlRootAttribute("DOCUMENT");
XmlSerializer xmls = new XmlSerializer(typeof(MSGData),xRoot);
MSGData messageData = (MSGData)xmls.Deserialize(new     
StringReader(response.Content.ReadAsstringAsync().Result));

解决方法

我将您的 XML 粘贴到 Xml2Csharp.com 中,因为我懒得弄清楚如何正确创建类。它给了我这些课程:

public class ITEM
{
    [XmlElement(ElementName = "ID")]
    public string ID { get; set; }
    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }
}

public class ITEMS
{
    [XmlElement(ElementName = "ITEM")]
    public List<ITEM> ITEM { get; set; }
}

public class MSGData
{
    [XmlElement(ElementName = "ITEMS")]
    public ITEMS ITEMS { get; set; }
}

[XmlRoot(ElementName = "DOCUMENT")]
public class DOCUMENT
{
    [XmlElement(ElementName = "MSGData")]
    public MSGData MSGData { get; set; }
}

然后我将您的 XML 放入一个文件中并反序列化为类型 DOCUMENT

[TestMethod]
public void Deserialize_MsgData()
{
    using var stream = File.OpenText("xmlfile1.xml");
    var serializer = new XmlSerializer(typeof(DOCUMENT));
    var deserialized = (DOCUMENT) serializer.Deserialize(stream);
    Assert.AreEqual(3,deserialized.MSGData.ITEMS.ITEM.Count);
}

那过去了。

您也可以调整属性名称,但如果我仅将其用于反序列化,我可能不会打扰。我还将记录我使用 Xml2Csharp 生成类,以便如果文件更改,下一个人也可以使用该工具(除非更改非常简单。)

给定这些类,您应该能够将反序列化更改为

XmlSerializer xmls = new XmlSerializer(typeof(DOCUMENT),xRoot);
DOCUMENT document = (DOCUMENT)xmls.Deserialize(new     
StringReader(response.Content.ReadAsStringAsync().Result));
MSGData messageData = DOCUMENT.MSGData'

也许只是我一个人,但我几乎总是使用这样的工具,我会竭尽全力避免手动创建类来反序列化 XML。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。