1

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

这是我的 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));
4

1 回答 1

0

我将您的 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。

于 2021-04-01T18:40:43.237 回答