如何解决如何使用 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 举报,一经查实,本站将立刻删除。