XML 在 C# 中反序列化返回 0 结果
XML Deserialize returning 0 results in c#
希望有人能指出我在这里遗漏了什么。我正在尝试反序列化 SOAP API 调用的结果。
我在结果 soapenv:Body 中有以下 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);
}
}
这是对 Deserialize 方法的调用
var alarmList = ser.Deserialize<OperationResponseInfo>(docInner.InnerXml);
我在另一个系统上工作(具有不同的 SOAP 结果 format/c# 类 等)但由于某种原因反序列化返回 0 个结果。该代码根本没有错误。我错过了什么?
命名空间和 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")]
意味着"an element called status
in the same namespace as the current context, i.e. http://www.XXXXX.com/webservice/
"
- 所以你需要明确告诉
XmlSerializer
回到空命名空间
希望有人能指出我在这里遗漏了什么。我正在尝试反序列化 SOAP API 调用的结果。
我在结果 soapenv:Body 中有以下 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);
}
}
这是对 Deserialize 方法的调用
var alarmList = ser.Deserialize<OperationResponseInfo>(docInner.InnerXml);
我在另一个系统上工作(具有不同的 SOAP 结果 format/c# 类 等)但由于某种原因反序列化返回 0 个结果。该代码根本没有错误。我错过了什么?
命名空间和 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")]
意味着"an element calledstatus
in the same namespace as the current context, i.e.http://www.XXXXX.com/webservice/
" - 所以你需要明确告诉
XmlSerializer
回到空命名空间