Как обессолить ответ XML API с несколькими атрибутами с одинаковым именем - PullRequest
0 голосов
/ 16 декабря 2018

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

<ArrayOfServiceAreas xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://tempuri.org/">
<ServiceAreas>
<City>
<string>ABDUL HAKIM /TULAMBA</string>
<string>ABOTTABAD</string>
<string>AHMED PUR EAST</string>
<string>ALI PUR</string>
<string>ALI PUR CHATTA</string>
<string>ARIF WALA</string>
<string>ATTOCK</string>
<string>BADIN</string>
<string>BAGH (AJK)</string>
<string>BANU</string>
<string>BAT KHELA</string>
<string>BAWALNAGAR</string>
<string>BHAI PHERU</string>
<string>BHAKKAR</string>
<string>BHALWAL</string>
<string>BHAWALPUR</string>
<string>BUREWALA</string>
<string>CHAKWAL</string>
<string>CHAMAN</string>
<string>CHARSADA</string>
<string>CHICHAWATNI</string>
<string>CHINNIOT</string>
<string>CHISTIAN</string>
<string>CHITRAL</string>
<string>D.G. KHAN</string>
<string>D.I. KHAN</string>
<string>DADU</string>
<string>DADYAL (AJK)</string>
<string>DALBANDIN</string>
<string>DARA ADAM KHEL</string>
<string>DARGAI</string>
</City>
</ServiceAreas>
</ArrayOfServiceAreas>

В C # я создал два класса, приведенных ниже, для десериализации объекта

[Serializable]
public class City
{
    [System.Xml.Serialization.XmlElement("string")]
    public string[] String { get; set; }
}

[Serializable()]
[System.Xml.Serialization.XmlRoot("ArrayOfServiceAreas")]
public class ArrayOfServiceAreas
{

    [XmlArray("ServiceAreas")]
    [XmlArrayItem("City", typeof(City))]
    public City[] City { get; set; }
}

Это контроллер, где я вызываю вышеупомянутые классы с помощью XML Serializer

public ActionResult City()
    {
        string Perameters = $"username={"myusername"}&password={"mypassword"}&AccountNo={"somenumber"}";
        string u = "http://mraabta.mulphico.pk/mnpconsignments/pushtomnp.asmx/Get_Cities?"+Perameters;
        var client = new RestClient(u);
        var request = new RestRequest(Method.GET);
        request.RequestFormat = DataFormat.Xml;
        request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
        var responce = client.Execute(request);
        //var r = JsonConvert.DeserializeObject<dynamic>(responce.Content);
        System.IO.StringReader SR = new System.IO.StringReader(responce.Content.ToString());

        XmlSerializer serializer = new XmlSerializer(typeof(MNP_Plus.Dserializer.MNPCities.ArrayOfServiceAreas));
        MNP_Plus.Dserializer.MNPCities.ArrayOfServiceAreas List = (MNP_Plus.Dserializer.MNPCities.ArrayOfServiceAreas)serializer.Deserialize(SR);

        return View();
    }

Содержание ответа указано выше вФорма XML, которую я хочу прочитать.выдает ошибку. В XML-документе есть ошибка (2, 2).Как я могу решить это.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Проблема в ваших классах картирования.Чтобы сделать вашу жизнь проще, вы можете воспользоваться онлайн-инструментом xml2csharp, чтобы получить правильные POCO. Здесь

Они должны выглядеть следующим образом:

[XmlRoot(ElementName = "City", Namespace = "http://tempuri.org/")]
    public class City
    {
        [XmlElement(ElementName = "string", Namespace = "http://tempuri.org/")]
        public List<string> String { get; set; }
    }

    [XmlRoot(ElementName = "ServiceAreas", Namespace = "http://tempuri.org/")]
    public class ServiceAreas
    {
        [XmlElement(ElementName = "City", Namespace = "http://tempuri.org/")]
        public City City { get; set; }
    }

    [XmlRoot(ElementName = "ArrayOfServiceAreas", Namespace = "http://tempuri.org/")]
    public class ArrayOfServiceAreas
    {
        [XmlElement(ElementName = "ServiceAreas", Namespace = "http://tempuri.org/")]
        public ServiceAreas ServiceAreas { get; set; }
        [XmlAttribute(AttributeName = "xsd", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Xsd { get; set; }
        [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string Xsi { get; set; }
        [XmlAttribute(AttributeName = "xmlns")]
        public string Xmlns { get; set; }
    }

Я смог прочитать ваш XML-файл без проблем.

Вот сериализаторЯ использовал:

 public class Serializer
    {
        public T Deserialize<T>(string input) where T : class
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

            using (StringReader stringReader = new StringReader(input))
            {
                return (T)xmlSerializer.Deserialize(stringReader);
            }
        }

        public string Serialize<T>(T ObjectToSerialize)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(ObjectToSerialize.GetType());
            StringBuilder builder = new StringBuilder();
            using (StringWriterWithEncoding textWriter = new StringWriterWithEncoding(builder, Encoding.UTF8))
            {
                xmlSerializer.Serialize(textWriter, ObjectToSerialize);
                return textWriter.ToString();
            }
        }
    }
    public class StringWriterWithEncoding : StringWriter
    {
        Encoding encoding;

        public StringWriterWithEncoding(StringBuilder builder, Encoding encoding)
        : base(builder)
        {
            this.encoding = encoding;
        }

        public override Encoding Encoding
        {
            get { return encoding; }
        }
    }

И, наконец, вот исполнение:

 var serializer = new Serializer();

//I used a local file for testing, but it should be the same thing with your api response
                var xmlInputData = File.ReadAllText(@"MyXmlPath");

                var output = serializer.Deserialize<ArrayOfServiceAreas>(xmlInputData);
0 голосов
/ 16 декабря 2018

Не нашел решения для моего Вопроса вовремя, поэтому я сделал это по старинке. Если кто-то еще попадет в этот беспорядок, тогда решение может быть

private List<string> GetCities(string Responce)
    {
        List<string> list = new List<string>();
        bool Collection = false;
        string item = "";
        int count = 0;
        foreach (char i in Responce)
        {
            if (Collection)
            {
                if(i == '<') { list.Add(item); item = ""; Collection = false; }
                else { item = item + i; }
            }
            if (count == 0) { if (i == '<') { count = 1; } }
            else if (count == 1) { if (i == 's') { count = 2; } else { count = 0; } }
            else if (count == 2) { if (i == 't') { count = 3; } else { count = 0; } }
            else if (count == 3) { if (i == 'r') { count = 4; } else { count = 0; } }
            else if (count == 4) { if (i == 'i') { count = 5; } else { count = 0; } }
            else if (count == 5) { if (i == 'n') { count = 6; } else { count = 0; } }
            else if (count == 6) { if (i == 'g') { count = 7; } else { count = 0; } }
            else if (count == 7) { if (i == '>') { Collection = true; } count = 0; }
        }
        return list;
    }

Внести изменения в соответствии с вашей проблемой.

...