XML Десериализация возвращает 0 результатов в c# - PullRequest
1 голос
/ 28 февраля 2020

в надежде, что кто-то укажет, что мне здесь не хватает. Я пытаюсь десериализовать результат вызова API SOAP.

У меня есть следующая внутренняя XML в пределах soapenv: Тело результата

<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 format / c# classes et c.), но по какой-то причине десериализация возвращает 0 результатов. Код вообще не содержит ошибок. Чего мне не хватает?

1 Ответ

1 голос
/ 28 февраля 2020

Пространства имен и правила наследования между xmlns=..., псевдонимами пространства имен и тем, что предполагает XmlSerializer; try:

    [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 to go обратно в пустое пространство имен
...