2

次の 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>();
4

1 に答える 1

2

InnerException

「12 行目の 12 番目の 'Field' 開始タグが 'Metadata' の終了タグと一致しません。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; } }
}
于 2013-01-02T12:32:14.900 に答える