Десериализовать httpWebResponse в объект - PullRequest
0 голосов
/ 05 октября 2018

Я получил ответ в Интернете, и мне нужно удалить его из списка.Я получаю сообщение об ошибке "Корневой элемент отсутствует".Кто-нибудь подскажет, как это решить.Спасибо.

Я отлаживаю код и получаю текст ответа:

<ArrayOfLocation xmlns="http://schemas.datacontract.org/2004/07/Ordinging.Objects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Location>
    <locationID>401</locationID>
    <locationName>Burnaby</locationName>
  </Location>
  <Location>
    <locationID>101</locationID>
    <locationName>Vancouver</locationName>
  </Location>
</ArrayOfLocation>

Мой код для стерилизации:

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {

            StreamReader reader = new StreamReader(response.GetResponseStream());                 
            result = reader.ReadToEnd();    
            XmlSerializer serializer = new XmlSerializer(typeof(List<LocationList.Location>));
            List<LocationList.Location> data = new List<LocationList.Location>();
            data = serializer.Deserialize(reader) as List<LocationList.Location>;

        }

Класс местоположения в моем приложении:

public class LocationList
{

    private List<Location> locations = null;
    [XmlElement("loctions")]
    public List<Location> locs
    {
        get { return locations; }
        set { locations = value; }
    }

    public class Location
    {
        public string locationName { get; set; }
        public Int64 locationID { get; set; }
        public Location(string name, Int64 id)
        {
            locationID = id;
            locationName = name;
        }
        public Location() { }

    }



}

1 Ответ

0 голосов
/ 05 октября 2018

Один из способов сделать это.Измените его, чтобы вместо этого использовать xml из вашего ответа.Я использовал жестко закодированную строку только для моего тестирования).

Редактировать : Добавлена ​​вспомогательная функция, чтобы игнорировать пространство имен, если вам нужно это сделать.В противном случае xml должен соответствовать пространству имен.

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace TestCodeApp {
    class TestCode {
        static void Main () {
            string xmlString = @"
<ArrayOfLocation xmlns='http://schemas.datacontract.org/2004/07/Ordinging.Objects' xmlns:i='http://www.w3.org/2001/XMLSchema-instance'>
  <Location>
    <locationID>401</locationID>
    <locationName>Burnaby</locationName>
  </Location>
  <Location>
    <locationID>101</locationID>
    <locationName>Vancouver</locationName>
  </Location>
</ArrayOfLocation>";

            StringReader stringReader = new StringReader (xmlString);
            XmlSerializer serializer = new XmlSerializer (typeof (List<Location>), new XmlRootAttribute ("ArrayOfLocation"));
            List<Location> locations = (List<Location>) serializer.Deserialize (new XmlTextReaderHelper(stringReader));

            foreach (Location item in locations) Console.WriteLine (item);
        }
    }

    public class XmlTextReaderHelper : XmlTextReader {
        public XmlTextReaderHelper (System.IO.TextReader reader) : base (reader) { }

        public override string NamespaceURI {
            get { return ""; }
        }
    }

    public class Location {
        public int locationID { get; set; }
        public string locationName { get; set; }
        public override string ToString () {
            return "ID: " + locationID + " - " + locationName;
        }
    }
}
...