如何反序列化列表以获取元素值

时间:2018-12-20 04:54:46

标签: c# .net xml list serialization

我尝试使用以下XML测试对我的Web API的1个HTTP POST XML请求:

<trx>
            <header>...</header>
            <body>
        <unity keycnt="4">
            <key param="param1"><![CDATA[value1]]</key>
            <key param="param2"><![CDATA[value2]]</key>
            <key param="param3"><![CDATA[value3]]</key>
            <key param="param4"><![CDATA[value4]]</key>
            </unity>
        </body>
        </trx>

当我使用此类列表反序列化该请求时:

 [Serializable()]
    [XmlRoot(ElementName="trx")]
    public class Trx {
        [XmlElement("header")]
        public Header Header { get; set;}
         [XmlElement("body")]
        public Body Body{ get; set;}
    }

课程正文:

 [Serializable()]
    public class Body{
        [XmlElement("unity")]
        public Unity Unity{ get; set;}
    }

Unity类:

  [Serializable()]
        public class Unity{
            [XmlAttribute("keycnt")]
            public string keycnt{ get; set;}
       [XmlElement("key")]
            public List<Key> KeyList{ get; set;}
        }

类密钥:

  [Serializable()]
            public class Key{
                [XmlAttribute("param")]
                public string param{ get; set;}
            }

反序列化后,我得到除键列表项的值之外的所有属性。(value1,value2,value3,value4)

2 个答案:

答案 0 :(得分:1)

您需要使用Key数据类型向string类添加一个属性,然后您的XmlSerializer将为您在CDATA中反序列化值。

并使用[XmlText]装饰此属性。此属性可以为您提供CDATA作为xml中特定节点中的文本。

所以您的Key类应该是。

[Serializable()]
public class Key
{
    [XmlAttribute("param")]
    public string param { get; set; }
    [XmlText]
    public string Text { get; set; }
}

答案 1 :(得分:0)

还要检查您是否输入了XML。您的XML格式错误。这里更正了一个。最后缺少CDATA元素。

<trx>
<header></header>
<body>
    <unity keycnt="4">
        <key param="param1"><![CDATA[value1]]></key>
        <key param="param2"><![CDATA[value2]]></key>
        <key param="param3"><![CDATA[value3]]></key>
        <key param="param4"><![CDATA[value4]]></key>
    </unity>
</body>