【问题标题】:How to add an end tag on a List when using XML Serialization in c#?在 C# 中使用 XML 序列化时如何在列表上添加结束标记?
【发布时间】:2016-08-18 01:51:39
【问题描述】:

我在尝试序列化 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>

【问题讨论】:

  • 你使用的数据是什么,它是如何在内存中构造的?从 Xml 看起来,您正在序列化一个包含 6 个元素的数组 - 在很多情况下,它将为数组(行)序列化一个元素,为数组元素(设置)序列化 6 个元素。
  • 我正在读取一个 xml 文件 (xmlReader) 而不对其进行修改、序列化并尝试将其写回 xml。行列表下面应该有 3 个元素(设置),然后它应该开始一个新的行标签。

标签: c# xml serialization


【解决方案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 更短、更易于阅读的名称。即使在您那里的小代码示例中也很难阅读。

【讨论】:

    【解决方案2】:

    我最终不得不将类更改为 2 个不同的 XMLElementAttributes 才能使其工作,Richard Matheson 非常接近。 Setting 和 Row 必须分开。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2022-01-08
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多