Я получил эту ошибку при десериализации XML в C # - PullRequest
0 голосов
/ 27 сентября 2019

Я получил эту ошибку во время десериализации моего XML.Не могли бы вы помочь мне понять, что не так, я работаю над этим в течение нескольких часов.Это должна быть какая-то маленькая деталь, которую я упускаю, или, может быть, проблема в корне.

Ошибка: «В xml документе (1, 40) есть ошибка»

Вот мой класс:

    [Serializable()]
    [XmlRoot("return")]
    public class Response
    {
        private string ticket { get; set; };
        private string name { get; set; };
        private string profile { get; set; };
        private string companyId { get; set; };       
        private string storeId { get; set; };
        private string terminalId { get; set; };
        private string accountNo { get; set; };
        private bool postae { get; set; };
        private bool postaeproduct { get; set; };
    }

Это XML, который я пытался десериализовать

<?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
     <ns2:loginResponse xmlns:ns2="http://webservices/">
       <return>
       <xml>
       <ticket>123456789</ticket>
       <name>TEST</name>
       <profile>Sale</profile>
       <companyId>2</companyId>
       <storeId>1</storeId>
       <terminalId>1</terminalId>
       <accountNo>0000000001</accountNo>
       <postae>true</postae>
       <postaeproduct>true</postaeproduct>
       </xml> 
       </return>
     </ns2:loginResponse>
   </S:Body>
</S:Envelope>

И, наконец, метод десериализации

private T Deserializa<T>(byte[] xmlByteData)
        {       XmlSerializer ds = new XmlSerializer(typeof(T));
                MemoryStream memoryStream = new MemoryStream(xmlByteData);
                object d = ds.Deserialize(memoryStream);
                return (T)d;
            }

ОБНОВЛЕНИЕ

Вот как выглядит цепочка, которая обрабатывается в методе десериализации:

"<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"><S:Body><ns2:loginResponse xmlns:ns2=\"http://webservices/\"><return>&lt;xml&gt;&lt;ticket&gt;123456789&lt;/ticket&gt;&lt;name&gt;TEST&lt;/name&gt;&lt;profile&gt;Sale&lt;/profile&gt;\n&lt;companyId&gt;2&lt;/companyId&gt;\n&lt;storeId&gt;1&lt;/storeId&gt;\n&lt;terminalId&gt;1&lt;/terminalId&gt;\n&lt;accountNo&gt;0000000001&lt;/accountNo&gt;\n&lt;postae&gt;true&lt;/postae&gt;\n&lt;postaeproduct&gt;true&lt;/postaeproduct&gt;\n&lt;/xml&gt;\n</return></ns2:loginResponse></S:Body></S:Envelope>"

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Раньше я имел дело с большим количеством Xml из API на работе, и у нас часто возникали проблемы с Xml Serializer.

Если у вас это работает, то хорошо, но если нет, я создал проект под названием Xml Mirrorэто делает довольно простым создание парсеров (и авторов) Xml C # с использованием отражения (получить его / отражение?).

https://github.com/DataJuggler/XmlMirror

А вот видео, которое я сделал пару недельназад для аналогичной проблемы:

Создание анализаторов XML с зеркалом Xml: https://www.youtube.com/watch?v=iGRWDlzVq6s

0 голосов
/ 28 сентября 2019

Здесь я вижу несколько проблем, как с XML, так и с настройкой класса.

  • Эти пространства имен не обрабатываются в коде:
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
     <ns2:loginResponse xmlns:ns2="http://webservices/">
  • Ваш корневой return объект содержит еще один вложенный объект с именем xml, поэтому вы должны добавить туда класс xml, например:
    [Serializable()]
    [XmlRoot("return")]
    public class Response
    {
        private Xml xml { get; set; };
    }

    [Serializable()]
    [XmlRoot("xml")]
    private class Xml
    {
        private string ticket { get; set; };
        private string name { get; set; };
        private string profile { get; set; };
        private string companyId { get; set; };       
        private string storeId { get; set; };
        private string terminalId { get; set; };
        private string accountNo { get; set; };
        private bool postae { get; set; };
        private bool postaeproduct { get; set; };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...