【问题标题】:XmlRoot attribute serialization to a fileXmlRoot 属性序列化到文件
【发布时间】:2015-05-21 00:50:36
【问题描述】:

我有以下代码将一个对象序列化到一个文件中:

TemplateClass item = new TemplateClass();
// Fill in item
XmlSerializer writer = new XmlSerializer(typeof(TemplateClass));
using (StreamWriter file = new StreamWriter(filePath))
{
   writer.Serialize(file, item);
}

其中TemplateClass定义如下:

public class TemplateClass
{
    public List<SubTemplate> Accounts;
}

[XmlRoot(ElementName = "Account")]
public class SubTemplate
{
    public string Name;
    public string Region;
}

我期待 XmlRoot 属性在文件中写入 Account 代替 SubTemplate。但是文件输出目前看起来是这样的:

<TemplateClass>
  <Accounts>
    <SubTemplate>
       <Name>SampleName</Name>
       <Region>SampleRegion</Region>
    </SubTemplate>
  </Accounts>
</TemplateClass>

如何更改我的代码以使输出如下所示:

<TemplateClass>
  <Accounts>
    <Account>
       <Name>SampleName</Name>
       <Region>SampleRegion</Region>
    </Account>
  </Accounts>
</TemplateClass>

我不想将 SubTemplate 类的名称更改为 Account。

【问题讨论】:

    标签: c# xml-parsing xml-serialization xmlroot


    【解决方案1】:

    您可以从SubTemplate 类中删除[XmlRoot(...)] 属性。

    有几种可能的解决方案:

    1. 使用[XmlArray][XmlArrayItem] 属性:

      将这些属性添加到TemplateClassAccounts 成员:

      public class TemplateClass
      {
          [XmlArray("Accounts")]
          [XmlArrayItem("Account")]
          public List<SubTemplate> Accounts;
      }
      
    2. 使用[XmlType] 属性:

      您可以在 SubTemplate 类上最初使用的 [XmlRoot] 上使用此属性。

      [XmlType("Account")]
      public class SubTemplate
      {
          public string Name;
          public string Region;
      }
      

    这两个都会产生以下输出:

    <?xml version="1.0" encoding="utf-8"?>
    <TemplateClass xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <Accounts>
        <Account>
          <Name>First name</Name>
          <Region>First region</Region>
        </Account>
        <Account>
          <Name>Second name</Name>
          <Region>Second region</Region>
        </Account>
      </Accounts>
    </TemplateClass>
    

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多