繁体   English   中英

如何使用 Z3501BB093D363810B671059B 属性将 XML 反序列化为 C# Object 属性

[英]How to Deserialize XML to C# Object using XML attributes

与 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM