gpt4 book ai didi

c# - 如何在类而不是属性上设置 XML 元素的名称

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:57 25 4
gpt4 key购买 nike

我正在尝试做一个看似简单的任务,但事实证明它非常复杂。

.NET 的 System.Xml.Serialization 命名空间似乎在支持静态 XML 结构方面做得非常好,但不是那么多动态结构。

我正在尝试建立一个 XML 文档,其中的元素的子元素可以是多种类型中的一种,并且可以按任意顺序排列。据我了解,您可以通过这种方式命名具有相同名称的子元素列表:

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

它们没有特定的顺序,并且类型可以出现不止一次。我已经看到一些答案,人们建议在类上使用 XmlType 属性来声明元素名称,但似乎功能在当时和现在之间发生了变化,因为该类型所做的只是声明模式元素类型:

[Serializable]
[XmlRoot("Parent")]
public class MyElement
{
[XmlElement]
public BaseChildElement[] MyChildren { get; set; }
}

[Serializable]
public abstract class BaseChildElement {}

[Serializable]
[XmlType("ChildTypeA")]
public class ChildElementA : BaseChildElement
{
[XmlAttribute]
public string Content { get; set; }
}

[Serializable]
[XmlType("ChildTypeB")]
public class ChildElementB : BaseChildElement
{
[XmlAttribute]
public string Content { get; set; }
}

这将生成如下所示的 XML:

<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 要求预先静态声明可能遇到的类型,通过属性。由于您希望类型由使用的元素名称而不是 "xsi:type" attribute 确定,您应该应用 [XmlElement(typeof(TBaseChildElement))] 的多个实例属性到您的 MyChildren 属性,一个对应于 BaseChildElement 的每个可能的子类型:

[XmlRoot("Parent")]
public class MyElement
{
[XmlElement(typeof(ChildElementA))]
[XmlElement(typeof(ChildElementB))]
public BaseChildElement[] MyChildren { get; set; }
}

public abstract class BaseChildElement { }

[XmlType("ChildTypeA")]
public class ChildElementA : BaseChildElement
{
[XmlAttribute]
public string Content { get; set; }
}

[XmlType("ChildTypeB")]
public class ChildElementB : BaseChildElement
{
[XmlAttribute]
public string BContent { get; set; }
}

样本 fiddle .

XmlElementAttribute.ElementName没有为任何子类型明确指定,它将取自 XmlTypeAttribute.TypeName每种子类型。

关于c# - 如何在类而不是属性上设置 XML 元素的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42539016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com