如何使用 Xml 属性序列化带有节点集合的 XML

Posted

技术标签:

【中文标题】如何使用 Xml 属性序列化带有节点集合的 XML【英文标题】:How to serialize XML with collections of nodes using Xml Attributes 【发布时间】:2022-01-01 02:55:15 【问题描述】:

我正在尝试使用 XmlSerializer 并使用其属性来序列化 Xml。 我的问题是我没有得到 EVENT 项目的数据。 我不完全了解如何使用属性(XmlRootXmlElement 来处理 EVENTSCOLLECTIONEVENT 之间的组合strong> - 我应该使用 XmlArray 吗?) 我得到了 0 个项目的 EventsCollection。我宁愿摆脱 EventsCollection 类 - 它只是因为我不知道如何使用组合。 这是我的 XML:

<MSGDATA>
    <EVENTSCOLLECTION>
        <EVENT>
            <Id>1</Id>
            <EventNumber>100</EventNumber>
        </EVENT>
        <EVENT>
            <Id>2</Id>
            <EventNumber>200</EventNumber>
        </EVENT>
        <EVENT>
            <Id>3</Id>
            <EventNumber>300</EventNumber>
        </EVENT>
    </EVENTSCOLLECTION>
</MSGDATA>

这是数据结构:

[XmlRoot(ElementName="EVENT")]
public class EventItem

    [XmlElement("Id")]
    public int ID get; set;
    
    [XmlElement("EventNumber")]
    public int EventNumber get; set;


//I would get rid of it if I could find a way
[XmlRoot(ElementName="EVENTSCOLLECTION")]
public class EventsCollection

    private List<EventItem> eventItems
    public List<EventItem> EventItems
    
        get
        
            if (eventItems == null)
            
                eventItems = new List<EventItem>();
            
            return eventItems;
        
        set
        
            eventItems = value;
        
    


[XmlRoot(ElementName="MSGDATA")]
public class EventMsgData

    [XmlElement("EVENTSCOLLECTION")]
    //I would replace this propery with a property with a type of List<EventItem> if I would know how to combine it with the XML attributes 
    private EventsCollection events;
    public EventsCollection Events  get; set;  

这就是我尝试序列化它的方式:

XmlSerializer xmls = new XmlSerialized(typeof(EventMsgData));
EventMsgData result = (EventMsgData)xmls.Deserialize(new StringReader(<text of MSGDATA xml node>))

【问题讨论】:

【参考方案1】:

我通过这些更改解决了这个问题:

    我删除了 EventsCollection 类 - 它不是必需的。

    我已经使用了属性:

    [XmlArray("EVENTSCOLLECTION")]

    [XmlArrayItem("EVENT")]

在EventMsgData类中,如下图:

[XmlArray("EVENTSCOLLECTION")]
[XmlArrayItem("EVENT")]
public List<EventItem> EventItems

【讨论】:

以上是关于如何使用 Xml 属性序列化带有节点集合的 XML的主要内容,如果未能解决你的问题,请参考以下文章

使用属性和未包装的集合反序列化 XML 响应

如何使用 boost 属性树提取 xml 文件的 DOCTYPE 节点?

C#:带有循环链接的节点的 xml 序列化

使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性

反序列化带有属性的 XML 数组

GroovyXml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 删除 Xml 文件中的节点 | 增加 Xml 文件中的节点 | 将修改后的 Xml 数据输出到文件中 )