【问题标题】:XML Deserialize returning 0 results in c#XML反序列化在c#中返回0结果
【发布时间】: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 结果。代码根本没有错误。我错过了什么?

【问题讨论】:

    标签: c# xml deserialization xml-deserialization


    【解决方案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 时,该前缀由后代继承 - 它必须是显式的
    • 所以&lt;status&gt;&lt;result&gt; 在空命名空间中
    • XmlSerializer 假定默认情况下会继承命名空间,因此[XmlElement(ElementName = "status")] 表示“与当前上下文在同一命名空间中称为status 的元素,即http://www.XXXXX.com/webservice/
    • 所以你需要明确告诉XmlSerializer回到empty命名空间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多