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

Posted

技术标签:

【中文标题】如何反序列化列表以获取元素值【英文标题】:How to deserialize list to take element value 【发布时间】:2019-05-20 14:47:07 【问题描述】:

我尝试使用这样的 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;
    

统一类:

  [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)

【问题讨论】:

能否请您展示您的 xml 反序列化代码? 看看xmltocsharp.azurewebsites.net 【参考方案1】:

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

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

所以你的Key 课程应该是。

[Serializable()]
public class Key

    [XmlAttribute("param")]
    public string param  get; set; 
    [XmlText]
    public string Text  get; set; 

【讨论】:

【参考方案2】:

检查您输入的 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>

【讨论】:

抱歉,打错了:D

以上是关于如何反序列化列表以获取元素值的主要内容,如果未能解决你的问题,请参考以下文章

如何在给定元素后反序列化 XML 并获取特定键的值

如何从动态对象中获取反序列化的 xml 属性

如何将不同类型的子元素反序列化为基类型的列表/集合,这是相应类的属性

Groupby 和 Aggregate 以列表为元素的 pandas 列,并在列表中获取唯一值

在反序列化期间获取任何深度的XMLElement

如何从列表“StandardListItem”中的 JSON 文件中的元素“名称”中获取所有值?