c# - XML反序列化: working with list

标签 c# xml properties deserialization

我有以下 XML 文件格式。我想将以下内容反序列化为对象,但它不起作用。我在反序列化“Field”时遇到问题。

<ExportDefinition>
  <DestinationDir>C:\Export\</DestinationDir>
  <LevelID>102</LevelID>
  <Metadata>
    <Field>
        <Source>CreateDate</Source>
        <DataType>DateTime</DataType>
    <Field>
    <Field>
        <Source>UserName</Source>
        <DataType>Text</DataType>
    <Field>
  </Metadata>
</ExportDefinition>



static void Main(string[] args)
{
   string xmlFile = @"C:\cobra_exp_def.xml";
   FileStream ReadFileStream = new FileStream(xmlFile, FileMode.Open, FileAccess.Read, FileShare.Read);

  XmlSerializer SerializerObj = new XmlSerializer(typeof(ExportDefinition));
  ExportDefinition LoadedObj = (ExportDefinition)SerializerObj.Deserialize(ReadFileStream);

  ReadFileStream.Close();
}

public class ExportDefinition
{
   [XmlElement]
   public string DestinationDir { get; set; }

   [XmlElement]
   public string LevelID { get; set; }
}

public class Metadata
{
   private List<Field> list = new List<Field>();

   [XmlElement]
   public List<Field> Metadata { get { return list; } set { list = value; } }
}

public class Field
{
  [XmlElement]
  public string Source { get; set; }

  [XmlElement]
  public string DataType { get; set; }
}

解决方案

最终成功实现以下功能:

[XmlArray("Metadata"), XmlArrayItem("Field", typeof(Field))]
        public List<Field> Metadata
        {
            get { return (_fields); }
            set { _fields = value; }
        } 

        private List<Field> _fields = new List<Field>();

最佳答案

InnerException 是:

"The 'Field' start tag on line 12 position 12 does not match the end tag of 'Metadata'. Line 13, position 5."

这是完全正确的; xml 无效。应该是:

<Field>
    <Source>CreateDate</Source>
    <DataType>DateTime</DataType>
</Field>  <!-- EDITED HERE -->
<Field>
    <Source>UserName</Source>
    <DataType>Text</DataType>
</Field>  <!-- EDITED HERE -->

始终查看InnerException。如果有 InnerException,也看看它。

您还需要向 ExportDefinition 添加 Metadata 属性,并在列表属性上使用 EmlElement("Field")]元数据内。

或者更简单地说,完全删除 Metadata 类:

public class ExportDefinition
{
   [XmlElement]
   public string DestinationDir { get; set; }

   [XmlElement]
   public string LevelID { get; set; }

   private List<Field> list = new List<Field>();

   [XmlArray("Metadata")]
   [XmlArrayItem("Field")]
   public List<Field> Items { get { return list; } }
}

关于c# - XML反序列化: working with list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14122023/

相关文章:

c# - TcpClient.Connected 返回 true 但客户端未连接,我可以使用什么代替?

c# - 使用 LINQ 更新字符串数组

c# - 来自当前用户的 PSCredentials

java - 如何删除输入xml中的空标签

mysql - 将列名映射到字段名 LOAD XML LOCAL INFILE

php - 类变量的默认值

c# - 在哪里放置代码以在 View 中创建大量按钮?

xml - descendants-or-self 返回的顺序是什么,它如何与子轴一起使用?

ios - 属性(property)申报疯狂 iOS 7

ios - 当 UITextField 的 "editingDidBegin"控件事件触发时,将 UITextField 的当前值设置为属性