如何使用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。

最新更新