C# 在C语言中序列化XML非包含数组#

C# 在C语言中序列化XML非包含数组#,c#,xml,serialization,C#,Xml,Serialization,我正在开发一个需要反序列化XML文档的应用程序,如下所示: <results> <item ...> </item> <item ...> </item> <item ...> </item> ... </results> [XmlRoot("results")] public class Results { [XmlArray("item")] [XmlArr

我正在开发一个需要反序列化XML文档的应用程序,如下所示:

<results>
  <item ...>
  </item>
  <item ...>
  </item>
  <item ...>
  </item>
  ...
</results>
[XmlRoot("results")]
public class Results 
{
  [XmlArray("item")]
  [XmlArrayItem("item", typeof(Item))]
  public List<Item> Items { get; set; }
}

public class Item
{ 
  [XmlElement("name")]
  public string Name { get; set; }

  [XmlElement("description")]
  public string Description { get; set; }

  . . . 
}

...
所以我建立了一个如下的对象模型:

<results>
  <item ...>
  </item>
  <item ...>
  </item>
  <item ...>
  </item>
  ...
</results>
[XmlRoot("results")]
public class Results 
{
  [XmlArray("item")]
  [XmlArrayItem("item", typeof(Item))]
  public List<Item> Items { get; set; }
}

public class Item
{ 
  [XmlElement("name")]
  public string Name { get; set; }

  [XmlElement("description")]
  public string Description { get; set; }

  . . . 
}
[XmlRoot(“结果”)]
公开课成绩
{
[XmlArray(“项”)]
[XmlArrayItem(“项目”,类型(项目))]
公共列表项{get;set;}
}
公共类项目
{ 
[XmlElement(“名称”)]
公共字符串名称{get;set;}
[XmlElement(“描述”)]
公共字符串说明{get;set;}
. . . 
}
我已经尝试了许多关于如何声明和注释Items集合的变体,但无论如何,我从未在该集合中获得任何项。在.NET中,对不包含在公共父元素中的数组进行反序列化是否存在问题(例如,在本例中可能是什么)

我不能控制这个XML的格式,所以我必须让它按原样工作。我目前正在使用XDocument/XElement/XAttribute手动读取和解析XML,但这很痛苦。你知道为什么这样不行吗


提前感谢。

我做这项工作的第一步是创建一些示例实例并序列化它们。如果输出符合您的xml,您可以将其读回。这通常是把所有照片放在一起最简单的方法。但是数组、列表。。。有时真的很棘手。如果您被迫使用某个模式,那么为类的某些部分实现ISerializable有时会有所帮助。通过这种方式,您可以微调关键点,但对于其他部分,您可以享受默认xml序列化的奢侈。

我做这项工作的第一步是创建一些示例实例并对它们进行序列化。如果输出符合您的xml,您可以将其读回。这通常是把所有照片放在一起最简单的方法。但是数组、列表。。。有时真的很棘手。如果您被迫使用某个模式,那么为类的某些部分实现ISerializable有时会有所帮助。这样,您可以微调关键图片,但对于其他部分,您可以享受默认xml序列化的奢侈。

一个鲜为人知的秘密似乎是Visual Studio附带的。除其他功能外,您还需要两个功能:

从XML文件生成XSD

c:\>xsd myfile.xml
c:\>xsd myfile.xsd /classes
这将从XML推断出XSD,并将其输出到磁盘上。然后您可以采取以下措施:

从XSD文件生成C#类

c:\>xsd myfile.xml
c:\>xsd myfile.xsd /classes

这将生成一系列C#类,其中包含所有必需的序列化属性。您不必直接使用它们,但您肯定可以了解.Net的预期效果。

一个鲜为人知的秘密似乎是Visual Studio附带的。除其他功能外,您还需要两个功能:

从XML文件生成XSD

c:\>xsd myfile.xml
c:\>xsd myfile.xsd /classes
这将从XML推断出XSD,并将其输出到磁盘上。然后您可以采取以下措施:

从XSD文件生成C#类

c:\>xsd myfile.xml
c:\>xsd myfile.xsd /classes

这将生成一系列C#类,其中包含所有必需的序列化属性。您不必直接使用它们,但您肯定可以了解.Net的期望值。

关于您在问题中提供的示例xml内容,这可以做到:

[XmlRoot("results")]
public class Results 
{
  [XmlElement("item")]
  public List<Item> Items { get; set; }
}
[XmlRoot(“结果”)]
公开课成绩
{
[XmlElement(“项目”)]
公共列表项{get;set;}
}

它涵盖了没有外部元素的情况,例如可能被命名为“items”。

关于您在问题中提供的示例xml内容,这可以做到:

[XmlRoot("results")]
public class Results 
{
  [XmlElement("item")]
  public List<Item> Items { get; set; }
}
[XmlRoot(“结果”)]
公开课成绩
{
[XmlElement(“项目”)]
公共列表项{get;set;}
}

它涵盖了没有外部元素的情况,例如可能被命名为“items”。

感谢您的回复。使用这种方法,我能够正确地反序列化所有内容。非常优雅,谢谢你的回复。使用这种方法,我能够正确地反序列化所有内容。非常优雅。啊,我认为它必须被注释为数组。我本来想试试这个,但上面的解决方案太优雅了,我不得不这么做。谢谢你的回复。啊,我想它应该被注释为数组。我本来想试试这个,但上面的解决方案太优雅了,我不得不这么做。谢谢你的回复。