如何实现所需的 XML 序列化?

How to achieve the required XML serialisation?

以下class:

    public class CodelistFilters
    {
        [System.Xml.Serialization.XmlArray]
        public List<CodelistFilterAndElement> AndGroup;

    }
    public class CodelistFilterAndElement
    {
        [System.Xml.Serialization.XmlArray]
        public List<CodelistFilterOrElement> OrGroup;

        [System.Xml.Serialization.XmlAttribute]
        public string Relationship { get { return "And"; } }
    }

    public class CodelistFilterOrElement
    {
        [System.Xml.Serialization.XmlElement]
        public List<CodelistFilter> CodelistFilters;

        [System.Xml.Serialization.XmlAttribute]
        public string Relationship { get { return "Or"; } }
    }

    public class CodelistFilter
    {
        [System.Xml.Serialization.XmlAttribute]
        public string Name { get; set; }

        [System.Xml.Serialization.XmlAttribute]
        public string Value1 { get; set; }

        [System.Xml.Serialization.XmlAttribute]
        public string Value2 { get; set; }

    }

序列化为

<CodelistFilters xmlns:xsi="http://www.w3.org/2001/XMLSchema">
<AndGroup>
    <CodelistFilterAndElement>
        <OrGroup>
            <CodelistFilterOrElement>
                <CodelistFilters>
                    <CodelistFilter Name="Description" Value1="test" />
                </CodelistFilters>
            </CodelistFilterOrElement>
        </OrGroup>
    </CodelistFilterAndElement>
</AndGroup>

我有点明白了。但是,我正在努力实现这一目标:

<CodelistFilters xmlns:xsi="http://www.w3.org/2001/XMLSchema">
<Group Relationship="And"> 
    <Group Relationship="Or">
        <CodelistFilters Name="Description" Value1="test" />
    </Group>
</Group>

我应该如何构建我的 C# class 来实现这一点?我试过弄乱 XmlAttributes 和嵌套列表,但最终得到了 "wrong".

的不同版本

正如评论中所暗示的,您需要在 XML 和 类 之间建立一个 1:1 映射。你需要的 XML 中只有 3 个元素,所以你需要 3 个 类 来表示这些。

public class CodelistFilters
{    
    [XmlElement("Group")]
    public List<Group> Groups { get; set; }
}

public class Group
{
    [XmlAttribute]
    public string Relationship { get; set; }

    [XmlElement("Group")]
    public List<Group> Groups { get; set; }

    [XmlElement("CodelistFilter")]
    public List<CodelistFilter> CodelistFilters { get; set; }
}

public class CodelistFilter
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlAttribute]
    public string Value1 { get; set; }

    [XmlAttribute]
    public string Value2 { get; set; }
}

有关工作演示,请参阅 this fiddle