2013-01-02 41 views
2

我有以下XML文件格式。我想反序列化到对象中,但它不起作用。在反序列化“字段”时出现问题。XML反序列化:使用列表

<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>(); 
+0

“错误CS0542:‘元数据’:成员名称不能与它们的封闭类型” - 显示代码不编译......这可以让答案不可靠 –

回答

2

InnerException是:12

“ '田' 开始上线12位置标签不与“元数据”的结束标记不匹配,第13行,第5位。

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

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

请务必查看InnerException。如果那有一个InnerException,也看看。

您还需要一个Metadata属性添加到ExportDefinition,并在列表属性使用EmlElement("Field")]Metadata

或者更简单地说,完全删除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; } } 
} 
+0

谢谢Marc。你的想法导致我达到上述解决方案(在问题中)。 – mrd