C# 如何在类而不是属性上设置XML元素的名称
我试着做一件看起来很简单的事情,但事实证明它相当复杂 .NET的System.Xml.Serialization命名空间似乎在支持静态Xml结构方面做得很好,但在支持动态结构方面做得不太好 我正在尝试设置一个包含元素的XML文档,这些元素的子元素可以具有多种类型中的一种,并且可以按任意顺序排列。我的理解是,您可以通过以下方式命名具有相同名称的子元素列表:C# 如何在类而不是属性上设置XML元素的名称,c#,xml,serialization,C#,Xml,Serialization,我试着做一件看起来很简单的事情,但事实证明它相当复杂 .NET的System.Xml.Serialization命名空间似乎在支持静态Xml结构方面做得很好,但在支持动态结构方面做得不太好 我正在尝试设置一个包含元素的XML文档,这些元素的子元素可以具有多种类型中的一种,并且可以按任意顺序排列。我的理解是,您可以通过以下方式命名具有相同名称的子元素列表: [Serializable] [XmlRoot("Parent")] public class MyElement { [XmlEle
[Serializable]
[XmlRoot("Parent")]
public class MyElement
{
[XmlElement("Child")]
public string[] MyChildren { get; set; }
}
这将生成如下所示的XML:
<Parent>
<Child></Child>
...
<Child></Child>
</Parent>
<Parent>
<ChildTypeA></ChildTypeA>
<ChildTypeB></ChildTypeB>
...
<ChildTypeZ></ChildTypeZ>
</Parent>
<Parent>
<MyChildren xsi:type="ChildTypeA" Content="" />
<MyChildren xsi:type="ChildTypeB" Content="" />
<MyChildren xsi:type="ChildTypeA" Content="" />
...
</Parent>
这将生成如下所示的XML:
<Parent>
<Child></Child>
...
<Child></Child>
</Parent>
<Parent>
<ChildTypeA></ChildTypeA>
<ChildTypeB></ChildTypeB>
...
<ChildTypeZ></ChildTypeZ>
</Parent>
<Parent>
<MyChildren xsi:type="ChildTypeA" Content="" />
<MyChildren xsi:type="ChildTypeB" Content="" />
<MyChildren xsi:type="ChildTypeA" Content="" />
...
</Parent>
有人知道如何生成子元素的动态列表,其中子元素的类可以设置元素名吗
HTML是我尝试做的一个完美的例子。在HTML中,可以按任意顺序拥有任意类型的子元素:
<html>
<head></head>
<body>
<p>
<a href="google.com">Google</a>
<span>Some text</span>
<p>
<div>
<button>Click me</button>
<a href="stackoverflow.com">Stack Overflow</a>
<div>
<p>Hello world</p>
</body>
</html>
通常,在序列化多态对象或包含多态对象的集合时,XmlSerializer要求通过属性预先静态声明可能遇到的类型。由于您希望类型由所使用的元素名称而不是由确定,因此应将属性的多个实例应用于MyChildren属性,BaseChildElement的每个可能子类型对应一个实例: 样品
由于没有为任何子类型显式指定,因此将从每个子类型的中获取它。通常,在序列化多态对象或包含多态对象的集合时,XmlSerializer要求通过属性预先静态声明可能遇到的类型。由于您希望类型由所使用的元素名称而不是由确定,因此应将属性的多个实例应用于MyChildren属性,BaseChildElement的每个可能子类型对应一个实例: 样品
由于没有为任何子类型显式指定,它将从每个子类型的中获取。您是否尝试过在运行时创建类?请参阅。这里给出的答案显示了如何在运行时创建类型。这不是我想要做的。所有可能的子类型都是静态定义的。我的问题是,我需要一个可以是任何静态定义类型的子类列表,因此我无法在父类中设置元素名称,需要在每个子类中定义元素名称。Related。您是否尝试过在运行时创建类?请看。这里给出的答案显示了如何在运行时创建类型。这不是我想要做的。所有可能的子类型都是静态定义的。我的问题是,我需要一个可以是任何静态定义类型的子类列表,因此我无法在父类中设置元素名称,需要在每个子类中定义元素名称。Related。这是可行的,但我显然更喜欢使用每个子元素的运行时类型来确定元素名称,因为我有几个可以使用的子类型。您知道重写XmlSerializer以支持我正在尝试的操作有多容易吗?@jchitel-这就是它所做的。只要不指定XmlElementAttribute.ElementName,元素名称将来自子类型。还是我误解了你的问题?我说的是重写XmlSerializer以添加所需的行为。如果它是琐碎的,我想试一试,否则这个解决方案对我来说很好。编辑:所需的行为是指让它使用运行时类型,而不必指定每个可能的子项。@jchitel-我仍然不完全清楚上面的内容如何不能给出所需的行为。您是否只是不想为所有可能的派生类型添加[XmlElementTypeOfBaseChildElement]?因为在其他情况下,它的工作完全符合需要:类型可以以任何顺序出现在XML中,可能是交错的,名称取自[XmlType]声明。是的,抱歉,我意识到我不清楚。在您回复之前,我在之前的评论中添加了一个编辑。这可能会起作用,但我显然更希望它能够使用每个子元素的运行时类型来确定元素名称,因为我有几个子类型可以使用。您知道重写XmlSerializer以支持我正在尝试的操作有多容易吗?@jchitel-这就是它所做的。只要不指定XmlElementAttribute.ElementName,元素名称将来自子类型。还是我误解了你的问题?我说的是重写XmlSerializer以添加所需的行为。如果它是琐碎的,我想试一试,否则这个解决方案对我来说很好。编辑:所需的行为是指让它使用运行时类型,而不必指定每个可能的子项。@jchitel-我仍然不完全清楚上面的内容如何不能给出所需的行为。难道你就是不知道
ant是否必须为所有可能的派生类型添加[XmlElementTypeOfBaseChildElement]?因为在其他情况下,它的工作完全符合需要:类型可以以任何顺序出现在XML中,可能是交错的,名称取自[XmlType]声明。是的,抱歉,我意识到我不清楚。在您回复之前,我对之前的评论进行了编辑。