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

【讨论】:

以上是关于XML反序列化在c#中返回0结果的主要内容,如果未能解决你的问题,请参考以下文章

.NET(C#)通过JSON.NET反序列化Elasticsearch返回响应的结果

如何在c#中将xml反序列化为列表

在 C# 中为 WCF 服务反序列化简单的 XML 数组对象

在C#中序列化和反序列化之间保留xml元素的顺序

将 ODATA xml 序列化/反序列化为 C# 对象

C#中通过XmlSerializer类反序列化多个同名XML元素