0

Добрый день. Есть веб-сервис для получения данных по клиенту по ИНН. Это обычный GET запрос, в ответ выдает xml. Я сохранил xsd схему ответа с полным набором полей, конвертнул в классы C# с помощью Visual Studio Shell. При попытке получения данных, бывает такое что некоторых параметров нет, они пустые и выводится вот такая ошибка:

System.InvalidOperationException: "В документе XML (1, 40) присутствует ошибка." C#

Код программы:

xmlrequest.cs

class XMLRequest
{
    private Object O;
    private Type Otype;
    public XMLRequest(Type PassedClass)
    {
        this.O = Activator.CreateInstance(PassedClass);
        this.Otype = PassedClass;
    }


    public Object ReturnObjectFromRequest(string requestString)
    {
        if (this.O is null)
        {
            return null;
        }
        WebRequest request = WebRequest.Create(requestString);
        XmlSerializer serializer = new XmlSerializer(O.GetType());
        try
        {
            using (Stream stream = request.GetResponse().GetResponseStream())
            {
                O = serializer.Deserialize(stream);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"{ex.Message}");
            return null;
        }
        return O;

    }

}

Form1.cs

XMLRequest reqManager = new XMLRequest(typeof(req.ArrayOfreq));

        req.ArrayOfreq Obj = (req.ArrayOfreq)reqManager.ReturnObjectFromRequest($"https://focus-api.kontur.ru/api3/egrDetails?key={key}&inn={inn}&xml");

        var flat = Obj.req[0].UL.legalAddress.parsedAddressRF.flat.topoValue;

Классы которые получились из xsd схемы (кусок)

public partial class legalAddress
    {

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public parsedAddressRF parsedAddressRF;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public string date;
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1586.0")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class parsedAddressRF
    {

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public string zipCode;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public string regionCode;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public toponym regionName;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public toponym district;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public toponym city;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public toponym settlement;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public toponym street;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public toponym house;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public toponym bulk;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public toponym flat;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)]
        public string kladrCode;
    }
A K
  • 28,718
Andrey Sherman
  • 405
  • 1
  • 5
  • 16
  • Так какая там ошибка-то? – Pavel Mayorov Jul 04 '17 at 06:31
  • System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."

    Obj.req[].UL.legalAddress.parsedAddressRF.flat было null.

    – Andrey Sherman Jul 04 '17 at 07:23
  • Ну, значит там и правда null. Надо проверять объекты, к которым обращаешься – Pavel Mayorov Jul 04 '17 at 07:25
  • Сейчас попробовал сделать try catch, работает. На сколько понимаю, по другому никак не сделать? пробовал через if else, не получилось. – Andrey Sherman Jul 04 '17 at 07:37
  • Плохо пробовали – Pavel Mayorov Jul 04 '17 at 07:41
  • Видимо да. Честно пока даже и не знаю как это можно проверить. пробовал if (Obj.req[0].UL.legalAddress.parsedAddressRF.flat.topoValue !=null) {код}, пробовал использовать if (String.IsNullOrEmpty(Obj.req[0].UL.legalAddress.parsedAddressRF.flat.topoValue)). Но это не помогло мне( – Andrey Sherman Jul 04 '17 at 07:58
  • 1
    На null нужно проверять flat, а не topoValue. Однако, ошибка в заголовке темы возникает при парсинге xml, то есть xml некорректный. В общем, уточните проблему. – Alexander Petrov Jul 04 '17 at 08:16

0 Answers0