首页 > 解决方案 > 反序列化 XML 中的嵌套集合

问题描述

我从 Web 服务中获取了一些 XML,但它并没有按照我想要的方式反序列化。我想要一个 Row 元素的集合,其中每个元素都有一个 Value 元素的集合。但是,反序列化的对象仅捕获 XML 中的最后一个 Row 元素。以下是课程:

    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class SimpleCodeList
    {
        [XmlArray("rowField")]
        private SimpleCodeListValue[] rowField;

        [System.Xml.Serialization.XmlArrayItemAttribute("Value", IsNullable = false)]
        public SimpleCodeListValue[] Row
        {
            get
            {
                return this.rowField;
            }
            set
            {
                this.rowField = value;
            }
        }
    }

    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class SimpleCodeListValue
    {

        private string simpleValueField;

        private string columnRefField;

        public string SimpleValue
        {
            get
            {
                return this.simpleValueField;
            }
            set
            {
                this.simpleValueField = value;
            }
        }

        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string ColumnRef
        {
            get
            {
                return this.columnRefField;
            }
            set
            {
                this.columnRefField = value;
            }
        }
    }

这是 XML:

<CodeList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="...">
    <ColumnSet xmlns="">
        <Column Id="code" Use="required">
            <ShortName>Code</ShortName>
            <Data Type="normalizedString" Lang="en" />
        </Column>
        <Column Id="name" Use="optional">
            <ShortName>Name</ShortName>
            <Data Type="normalizedString" Lang="en" />
        </Column>
    </ColumnSet>
    <SimpleCodeList xmlns="">
        <Row>
            <Value ColumnRef="code">
                <SimpleValue>1234</SimpleValue>
            </Value>
            <Value ColumnRef="name">
                <SimpleValue>Service 123</SimpleValue>
            </Value>            
        </Row>
        <Row>
            <Value ColumnRef="code">
                <SimpleValue>5678</SimpleValue>
            </Value>
            <Value ColumnRef="name">
                <SimpleValue>Service 456</SimpleValue>
            </Value>            
        </Row>
     ...

如果我的类与给定的 XML 相对应正确,有人可以纠正我吗?谢谢你。

更新:我正在使用以下代码来反序列化 xml。

首先,我将 xml 字符串转换为 XmlDocument:

XmlDocument xml = new XmlDocument();
xml.LoadXml(responseFromServer);

然后通过这个函数运行它:

public static T Deserialize<T>(XmlDocument doc)
{
    var serializer = new XmlSerializer(typeof(T));
    XmlNodeReader reader = new XmlNodeReader(doc);
    using (reader)
    {
        return (T)serializer.Deserialize(reader);
    }            
}
...
CodeList codelist = Utility.Deserialize<CodeList>(xml);

我可以通过检查 XmlDocument 看到有 100 多个元素,但“codelist”对象仅包含其中 1 个。

标签: c#xmlserializationxml-deserialization

解决方案


推荐阅读