2016-08-18 9 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

什麼是你使用的數據,它是如何在內存中構造的?它從Xml看起來就像你正在序列化一個有6個元素的數組一樣 - 在很多情況下,它會爲數組(Row)和數組元素(Settings)序列化一個元素。 –

+0

我正在讀取一個xml文件(xmlReader)而無需修改它,將其序列化並嘗試將其寫回到xml。行列表下應該有3個元素(設置),然後它應該開始一個新的行標記。 – techmakin

回答

0

我最終不得不將該類更改爲2個不同的XMLElementAttributes以使其起作用,Richard Matheson非常接近。設置和行必須分開。

[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; } 
} 

然後,當你序列化了的集合,如清單...你會獲得一組具有3個元素的行。

如果你不想修改你的結構來像這樣工作,那麼你將不得不編寫類來手動創建xml,這可能會也可能不會更容易。

另外,您可能希望選擇比RTACModuleDeviceConnectionSettingPagesSettingPageRowSetting更短,更易於閱讀的名稱。即使在您所在的小代碼樣本中也很難閱讀。

相關問題