设置与根元素属性相同的元素名称

本文关键字:元素 属性 设置 | 更新日期: 2023-09-27 18:34:22

[XmlRootAttribute("ls")]
public class Request<T>
{
    [XmlAttribute("ver")]
    public string Version { get; set; }
    [XmlElement("hdr")]
    public Header Header { get; set; }
    [XmlElement(Type = typeof(class2), ElementName = "ChildClass")]
    public T Data { get; set; }
}

[XmlRoot("ChildClass")]
public class class2
{
    [XmlElement("login")]
    public string Property1{ get; set; }
}
[XmlRoot("ChildClass3")]
public class class3
{
    [XmlElement("User")]
    public string Property1{ get; set; }
}

Request<class2>被序列化时,元素名称是"Data"。我希望元素名称为"子类"。当Request<class3>被序列化时,元素名称应该是"ChildClass3"。我该怎么做

设置与根元素属性相同的元素名称

据我所知,元素名称必须在编译时知道,因此您不能尝试使用数据对象 XmlRoot 或类名或类似对象,因为这些在编译时是未知的。 您需要定义Data可能设置为的每个可能类型。 如下:

[XmlRoot("ls")]
public class Request
{
    [XmlAttribute("ver")]
    public string Version { get; set; }
    [XmlElement("ChildClass2",typeof(class2))]
    [XmlElement("ChildClass3",typeof(class3))]
    public object Data { get; set; }
}
public class class2
{
    [XmlElement("login")]
    public string Property1 { get; set; }
}
public class class3
{
    [XmlElement("User")]
    public string Property1 { get; set; }
}

以下两个对象:

var exampleObject = new Request
{
    Version = "versionExample",
    Data = new class2 { Property1 = "property1Example" }
};
var exampleObject2 = new Request
{
    Version = "versionExample",
    Data = new class3 { Property1 = "property1Example" }
};

然后序列化为:

<ls ver="versionExample">
  <ChildClass2>
    <login>property1Example</login>
  </ChildClass2>
</ls>
<ls ver="versionExample">
  <ChildClass3>
    <User>property1Example</User>
  </ChildClass3>
</ls>