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

时间:2017-03-01 18:12:51

标签: c# xml serialization

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

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

1 个答案:

答案 0 :(得分:4)

通常,在序列化多态对象(或包含多态对象的集合)时,import pandas as pd import numpy as np df = pd.read_csv("datafile.csv", index_col="DateTime", parse_dates=True) df = df.resample('1H').mean() df = df.reindex(pd.date_range(df.index.min(), df.index.max(), freq="1H")) df.ix[:,1:10].between_time('0:00', '3:00').resample('1M').mean() 要求通过属性提前静态声明可能遇到的类型。由于您希望类型由所使用的元素名称而不是  确定,因此您应该将 Eigen (partial) c++ port of kissfft.属性的多个实例应用于XmlSerializer属性,每个可能的子类型一个MyChildren

BaseChildElement

示例"xsi:type" attribute

由于没有为任何子类型明确指定[XmlElement(typeof(TBaseChildElement))],因此将从每种子类型的fiddle中获取它。