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回到命名空间