XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称

Posted

技术标签:

【中文标题】XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称【英文标题】:XML De/Serialization : How to define different name for same property of different instance of the class 【发布时间】:2021-11-24 21:41:44 【问题描述】:

我正在尝试序列化包含同一对象的两个列表的对象。

public class Foo

   public List<ClassA> DataA get;set;
   public List<ClassA> DataB get;set;


public class ClassA

  public string Code get;set;
  public string Value get;set;

在 xml 文件中,我希望类的属性具有不同的名称。像这样:

<Foo>
  <DataA>
    <ClassA>
      <Code></Code>
      <Value></Value>
    </ClassA>
  </DataA>
  <DataB>
    <ClassA>
      <Name></Name>
      <Text></Text>
    </ClassA>
  </DataB>
</Foo>

我尝试使用“XmlAttributeOverrides”,但属性名称已针对所有实例进行了修改,而不仅仅是一个。

有没有办法做到这一点?也许是自定义 XmlSerializer ?

谢谢

【问题讨论】:

使用不同的类?显然,他们不应该概括一些东西。 只是在黑暗中拍摄,您不要关闭&lt;DataA&gt;&lt;DataB&gt;properly。这也在你的本地代码中吗? @dba :不,这只是这篇文章中的一个错误;) @Fildor :它是一个泛型类,只有 2 个我用于不同目的的属性。在我的示例中,我有 2 个列表,但我可以有 5、6 或更多。所以,如果可能的话,我不希望每次都创建一个新类而只创建一个。 嗯,通用模型创建通用 XML ...现在您可以做一些花哨的代码魔术,可能使用注释/属性,或者您序列化通用并运行重命名标签的后期制作 XSLT ... 总而言之,我个人会选择一个不错的模型。但如果这不是你的选择,那么你可能不得不接受这些警告。 【参考方案1】:

将输入的 XML 复制到剪贴板中

<Foo>
  <DataA>
    <ClassA>
      <Code></Code>
      <Value></Value>
    </ClassA>
    <ClassA>
      <Code></Code>
      <Value></Value>
    </ClassA>
  </DataA>
  <DataB>
    <ClassA>
      <Name></Name>
      <Text></Text>
    </ClassA>
    <ClassA>
        <Code></Code>
        <Value></Value>
    </ClassA>
  </DataB>
</Foo>

并在 Visual Studio 中为您的项目添加一个新的类文件。 选择并清除命名空间内新创建文件的所有内容并使用Edit-&gt;paste Special-&gt;insert XML as code(或类似的东西,我有一个德语IDE)

应该给你这样的东西(经过一些重组)

namespace SandBoxApp


  // HINWEIS: Für den generierten Code ist möglicherweise mindestens .NET Framework 4.5 oder .NET Core/Standard 2.0 erforderlich.
  /// <remarks/>
  [System.SerializableAttribute()]
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
  [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
  public partial class Foo
  

    private FooClassA[] dataAField;

    private FooClassA[] dataBField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("ClassA", IsNullable = false)]
    public FooClassA[] DataA
    
      get
      
        return this.dataAField;
      
      set
      
        this.dataAField = value;
      
    

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("ClassA", IsNullable = false)]
    public FooClassA[] DataB
    
      get
      
        return this.dataBField;
      
      set
      
        this.dataBField = value;
      
    
  

  /// <remarks/>
  [System.SerializableAttribute()]
  [System.ComponentModel.DesignerCategoryAttribute("code")]
  [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
  public partial class FooClassA
  

    private object codeField;

    private object valueField;

    /// <remarks/>
    public object Code
    
      get
      
        return this.codeField;
      
      set
      
        this.codeField = value;
      
    

    /// <remarks/>
    public object Value
    
      get
      
        return this.valueField;
      
      set
      
        this.valueField = value;
      
    
  

您可能希望根据自己的需求进行重构,但它应该为您指明方向。

总结一下,我觉得你错过了属性:

 [System.Xml.Serialization.XmlArrayItemAttribute("ClassA", IsNullable = false)]

在你的清单上-Pperties

【讨论】:

以上是关于XML De/Serialization:如何为类的不同实例的相同属性定义不同的名称的主要内容,如果未能解决你的问题,请参考以下文章

如何为 <![CDATA[]]> 解析 XML

如何为每个 XML 节点添加换行符?

如何为各种列表视图项打开不同的 XML?

斯宾。如何为一个标签 xml 提供服务

如何为 XML 创建 XPath?

您如何为委托参数提供 xml 注释/文档?