如何反序列化列表以获取元素值
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以上是关于如何反序列化列表以获取元素值的主要内容,如果未能解决你的问题,请参考以下文章
如何将不同类型的子元素反序列化为基类型的列表/集合,这是相应类的属性