2016-08-18 11 views
-1

XMLファイルをシリアル化しようとすると終了タグを追加しようとしていますが、正しく機能していません。ここで私はここでC#でXMLシリアル化を使用するときにリストに終了タグを追加する方法は?

private List<RTACModuleDeviceConnectionSettingPagesSettingPageRowSetting> rowField; 

    /// <remarks/> 
    //[System.Xml.Serialization.XmlArrayAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    [System.Xml.Serialization.XmlArrayItem("Setting", typeof(RTACModuleDeviceConnectionSettingPagesSettingPageRowSetting), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)] 
    public List<RTACModuleDeviceConnectionSettingPagesSettingPageRowSetting> Row 
    { 
     get 
     { 
      return this.rowField; 
     } 
     set 
     { 
      this.rowField = value; 
     } 
    } 

を使用していたクラスは、XMLを書くためのコードがあるさ:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.OmitXmlDeclaration = true; 
     settings.Encoding = new UTF8Encoding(false); 
     settings.Indent = true; 
     settings.NamespaceHandling = NamespaceHandling.OmitDuplicates; 
     //settings.CloseOutput = true; 
     //settings.NewLineOnAttributes = true; 
     XmlSerializer xs = new XmlSerializer(deserializedDevice.GetType()); 

     MemoryStream ms = new MemoryStream(); 

     XmlWriter writer = XmlWriter.Create(ms, settings); 
     serializer.Serialize(writer, deserializedDevice, ns); 

     string text = Encoding.UTF8.GetString(ms.ToArray()); 
     File.WriteAllText(path, Encoding.UTF8.GetString(ms.ToArray())); 

私はこれが書き出されますことを期待しています:

 <Row> 
     <Setting enabled="false"> 
      <Column>Setting</Column> 
      <Value>Network Connection Type</Value> 
     </Setting> 
     <Setting> 
      <Column>Value</Column> 
      <Value>Telnet</Value> 
     </Setting> 
     <Setting> 
      <Column>Comment</Column> 
      <Value /> 
     </Setting> 
     </Row> 
     <Row> 
     <Setting enabled="false"> 
      <Column>Setting</Column> 
      <Value>Local Port Number</Value> 
     </Setting> 
     <Setting> 
      <Column>Value</Column> 
      <Value>5206</Value> 
     </Setting> 
     <Setting> 
      <Column>Comment</Column> 
      <Value /> 
     </Setting> 
     </Row> 

は、代わりに私が行方不明です行の複数の終了タグ:

 <Row> 
     <Setting 
      enabled="false"> 
      <Column>Setting</Column> 
      <Value>Network Connection Type</Value> 
     </Setting> 
     <Setting> 
      <Column>Value</Column> 
      <Value>Telnet</Value> 
     </Setting> 
     <Setting> 
      <Column>Comment</Column> 
      <Value /> 
     </Setting> 
     <Setting 
      enabled="false"> 
      <Column>Setting</Column> 
      <Value>Local Port Number</Value> 
     </Setting> 
     <Setting> 
      <Column>Value</Column> 
      <Value>5315</Value> 
     </Setting> 
     <Setting> 
      <Column>Comment</Column> 
      <Value /> 
     </Setting> 
     </Row> 
+0

どのようなデータが使用されていて、どのようにメモリに構築されていますか?多くの場合、配列の1つの要素(行)と配列の要素(設定)の6つをシリアル化する多くの場合、1つの配列を6つの要素で直列化しているように見えます。 –

+0

私はxmlファイル(xmlReader)を変更せずに読み込み、シリアル化してxmlに書き戻そうとしています。行リストには3つの要素(設定)があり、新しい行タグを開始する必要があります。 – techmakin

答えて

0

私は、クラスを2つの異なるXMLElementAttributesに変更して動作させる必要がありました。リチャードマテソンは非常に近いです。設定と行を区切らなければならなかった。

[System.Xml.Serialization.XmlElementAttribute("Row", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public RTACModuleDeviceConnectionSettingPagesSettingPage[] Row 
    { 
     get 
     { 
      return this.rowField; 
     } 
     set 
     { 
      this.rowField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlElementAttribute("Setting", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public List<RTACModuleDeviceConnectionSettingPagesSettingPageRowSetting> Setting 
    { 
     get 
     { 
      return this.settingField; 
     } 
     set 
     { 
      this.settingField = value; 
     } 
    } 
1

シリアライゼーションコードには何も問題はありません。シリアル化を機能させるには、クラスの構造に取り組む必要があります。

あなたはそれが行ごとに3つの設定を書きたい場合は、あなたがクラスに以下のようなものを構築する必要があります。

class Row 
{ 
    [XmlElement("Setting")] Setting[] Settings { get; set; } //Use an array of 3 elements here. A list should work as well. 
} 

class Setting 
{ 
    [XmlElement] public string Column { get; set; } 
    [XmlElement] public string Value { get; set; } 
} 

あなたがListなどのコレクションをシリアル化するときに...あなたがします3つの要素を持つ行のセットを取得します。

このように動作するように構造を変更したくない場合は、xmlを手動で作成するためのクラスを作成する必要があります。これは容易ではない場合もあります。

また、RTACModuleDeviceConnectionSettingPagesSettingPageRowSettingよりも短く読みやすい名前を選択することをお勧めします。小さなコードサンプルでも読みにくいです。

関連する問題