XML反序列化在c#中返回0结果
Posted
技术标签:
【中文标题】XML反序列化在c#中返回0结果【英文标题】:XML Deserialize returning 0 results in c# 【发布时间】:2020-06-12 09:26:16 【问题描述】:希望有人能指出我在这里遗漏的内容。我正在尝试反序列化 SOAP API 调用的结果。
soapenv 中有以下 InnerXML:结果正文
<ns2:OperationResponseInfo xmlns:ns2="http://www.XXXXX.com/webservice/">
<status>
<statusCode>0</statusCode>
<statusDesc>No Error</statusDesc>
</status>
<result>
<record>
<param>
<name>totalrecord</name>
<value>9</value>
</param>
</record>
</result>
<result>
<record>
<param>
<name>ALARMID</name>
<value>1581807719208</value>
</param>
<param>
<name>ALARMDESC</name>
<value>xxxxxxxxxxxxxx</value>
</param>
<param>
<name>ALARMSTATUS</name>
<value>Unacknowledged</value>
</param>
</record>
</result>
</ns2:OperationResponseInfo>
我正在尝试反序列化为以下对象:-
[XmlRoot(ElementName = "OperationResponseInfo", Namespace = "http://www.XXXXX.com/webservice/")]
public class OperationResponseInfo
[XmlElement(ElementName = "status")]
public Status Status get; set;
[XmlElement(ElementName = "result")]
public List<Result> Result get; set;
//[XmlAttribute(AttributeName = "ns2", Namespace = "http://www.XXXXX.com/webservice/")]
//public string Ns2 get; set;
[XmlRoot(ElementName = "status")]
public class Status
[XmlElement(ElementName = "statusCode")]
public string StatusCode get; set;
[XmlElement(ElementName = "statusDesc")]
public string StatusDesc get; set;
[XmlRoot(ElementName = "result")]
public class Result
[XmlElement(ElementName = "record")]
public List<Record> Record get; set;
[XmlRoot(ElementName = "record")]
public class Record
[XmlElement(ElementName = "param")]
public List<Param> Param get; set;
[XmlRoot(ElementName = "param")]
public class Param
[XmlElement(ElementName = "name")]
public string Name get; set;
[XmlElement(ElementName = "value")]
public string Value get; set;
这是我正在使用的反序列化方法
public class Serializer
public T Deserialize<T>(string input) where T : class
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
using (StringReader sr = new StringReader(input))
return (T)ser.Deserialize(sr);
这是对反序列化方法的调用
var alarmList = ser.Deserialize<OperationResponseInfo>(docInner.InnerXml);
我在另一个系统上工作(具有不同的 SOAP 结果格式/c# 类等),但由于某种原因,反序列化返回 0 结果。代码根本没有错误。我错过了什么?
【问题讨论】:
【参考方案1】:xmlns=...
之间的命名空间和继承规则、命名空间别名以及 XmlSerializer
的假设;试试:
[XmlElement(ElementName = "status", Namespace = "")]
public Status Status get; set;
[XmlElement(ElementName = "result", Namespace = "")]
public List<Result> Result get; set;
更具体地说:
使用xmlns="..."
时,命名空间由后代继承
当使用ns2:blah
时,该前缀不由后代继承 - 它必须是显式的
所以<status>
和<result>
在空命名空间中
但XmlSerializer
假定默认情况下会继承命名空间,因此[XmlElement(ElementName = "status")]
表示“与当前上下文在同一命名空间中称为status
的元素,即http://www.XXXXX.com/webservice/
”
所以你需要明确告诉XmlSerializer
回到empty命名空间
【讨论】:
以上是关于XML反序列化在c#中返回0结果的主要内容,如果未能解决你的问题,请参考以下文章
.NET(C#)通过JSON.NET反序列化Elasticsearch返回响应的结果