2015-05-18 3 views
0
<countries> 
    <country code="AF" iso="4">Afghanistan</country> 
    <country code="AL" iso="8">Albania</country> 
    <country code="DZ" iso="12">Algeria</country> 
    <country code="AS" iso="16">American Samoa</country> 
    <country code="AD" iso="20">Andorra</country> 
    <country code="AO" iso="24">Angola</country> 
    <country code="AI" iso="660">Anguilla</country> 
    <country code="AQ" iso="10">Antarctica</country> 
    <country code="AG" iso="28">Antigua And Barbuda</country> 
    <country code="AR" iso="32">Argentina</country> 
    <country code="AM" iso="51">Armenia</country> 
    <country code="AW" iso="533">Aruba</country> 
    <country code="AU" iso="36">Australia</country> 
    <country code="AT" iso="40">Austria</country> 
    <country code="AZ" iso="31">Azerbaijan</country> 
    <country code="BS" iso="44">Bahamas</country> 
    <country code="BH" iso="48">Bahrain</country> 
    <country code="BD" iso="50">Bangladesh</country> 
    <country code="BB" iso="52">Barbados</country> 
    <country code="BY" iso="112">Belarus</country> 
    <country code="BE" iso="56">Belgium</country> 
    <country code="BZ" iso="84">Belize</country> 
    <country code="BJ" iso="204">Benin</country> 
    <country code="BM" iso="60">Bermuda</country> 
    <country code="BT" iso="64">Bhutan</country> 
    <country code="BO" iso="68">Bolivia</country> 
    <country code="BA" iso="70">Bosnia And Herzegovina</country> 
    <country code="BW" iso="72">Botswana</country> 
    <country code="BV" iso="74">Bouvet Island</country> 
    <country code="BR" iso="76">Brazil</country> 
    <country code="IO" iso="86">British Indian Ocean Territory</country> 
    <country code="BN" iso="96">Brunei Darussalam</country> 
    <country code="BG" iso="100">Bulgaria</country> 
    <country code="BF" iso="854">Burkina Faso</country> 
    <country code="BI" iso="108">Burundi</country> 
</countries> 

Кто-нибудь, пожалуйста, назовите меня, как создать мой класс, чтобы десериализовать это.Как десериализовать xml-файл

Вот мой текущий дизайн

public class Country 
{ 
    public string country { get; set; } 
    public string code { get; set; } 
    public int iso { get; set; } 
} 

класс Но это не похоже на работу. Пожалуйста, помогите мне.

+0

Вы должны украсить свой класс с требуемыми атрибутами, чтобы сообщить системе, что исходит от атрибут и т. д. – mageos

ответ

3

В отличие от других ответов до сих пор, вы не необходимо использовать атрибут Serializable при работе с сериализацией Xml. Но вам нужно украсить ваши свойства атрибутами кода, описывающими, какую часть файла Xml будут принимать значения.

Поскольку вы не включили декларацию документа Xml в свой вопрос, я не уверен, что сборник стран является корневым узлом вашего документа или нет. Но давайте предположим, что весь ваш Xml документ на самом деле выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
<countries> 
    <country code="AF" iso="4">Afghanistan</country> 
    <country code="AL" iso="8">Albania</country> 
    <country code="DZ" iso="12">Algeria</country> 
</countries> 

Вы должны применить код атрибуты к классам, которые описывают, как вышеупомянутые карты Xml своих свойств и объекты. Эти атрибуты определены в System.Xml. Это как атрибуты могут выглядеть в вашем случае:

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 
... 
[XmlRoot("countries", Namespace="")] 
public class countriesDocument 
{ 
    [XmlElement("country")] 
    public country[] countries { get; set; } 
} 

public class country 
{ 
    [XmlText] 
    public string name { get; set; } 

    [XmlAttribute] 
    public string code { get; set; } 

    [XmlAttribute] 
    public int iso { get; set; } 
} 

Затем вы можете десериализацию документа что-то вроде следующего кода:

var serializer = new XmlSerializer(typeof(countriesDocument)); 
countriesDocument document; 
using (var reader = File.OpenText("countries.xml")) 
{ 
    document = (countriesDocument)serializer.Deserialize(reader); 
} 
+0

Спасибо RogerN. Это работало как шарм –

-1

Первый шаг к сериализации-десериализации класс является, чтобы пометить его с атрибутом Serializable

[Serializable] 
public class Country 
{ 
    public string country { get; set; } 
    public string code { get; set; } 
    public int iso { get; set; } 
} 
+0

Благодарим вас за отзыв «Оскар». Но какую ссылку мне нужно добавить для '[Serializable]'? –

+0

@GaneshKumar Класс SerializableAttribute находится в пространстве имен System. https://msdn.microsoft.com/en-us/library/vstudio/system.serializableattribute%28v=vs.100%29.aspx – Oscar

+2

'[Serializable]' недоступен для * WinRT *. –

-1

Прежде всего, по словам Оскара. Вы должны добавить декоратор Serializable к вашему классу.

[Serializable] 
public class Country 
{ 
    public string country { get; set; } 
    public string code { get; set; } 
    public int iso { get; set; } 
} 

Затем вы должны выполнить описанные выше действия для десериализации вашего XML в объекты:

private Country[] DeserializeCountries(string xmlPath) 
{ 
    // Create an instance of the XmlSerializer specifying type and namespace. 
    XmlSerializer serializer = new 
    XmlSerializer(typeof(Country)); 

    // A FileStream is needed to read the XML document. 
    FileStream fs = new FileStream(xmlPath, FileMode.Open); 
    XmlReader reader = XmlReader.Create(fs); 

    // Use the Deserialize method to restore the object's state. 
    Country[] countries = (Country[])serializer.Deserialize(reader); 
    fs.Close(); 

    return countries; 
} 

Код выше был адаптирован Microsoft Documentation

+0

Спасибо за ваш ответ silva. Но я не мог найти атрибут Serializable. И я разрабатываю приложение Windows Phone 8.1. Извините, что не упоминал об этом. Нужно ли добавлять какие-либо ссылки? –

+0

Андерс, можете ли вы отправить нам источник, который говорит, что [Serializable] недоступен для WinRT? –

+0

[Здесь] (https://msdn.microsoft.com/en-us/library/windows/apps/hh454070.aspx) является ссылкой на доступные типы в пространстве имен * System * для разработки приложения Windows Store, что соответствует для Windows Runtime. Как вы можете видеть в списке, 'SerializableAttribute' не включен. –

2

Там нет Сериализуемого атрибута для Windows 8 приложений, у вас есть использовать DataContractAttribute и DataMemberAttribute и украсить свой класс модели, что-то вроде этого:

[DataContractAttribute] 
public class Country 
{ 
    [DataMemberAttribute] 
    public string country { get; set; } 
    [DataMemberAttribute] 
    public string code { get; set; } 
    [DataMemberAttribute] 
    public int iso { get; set; } 
} 

и тогда вы можете сериализовать это CLAS s, вот пример для Json

public static string SerializeToJson(object instance) 
{ 
    using (MemoryStream _Stream = new MemoryStream()) 
    { 
    var _Serializer = new DataContractJsonSerializer(instance.GetType()); 
    _Serializer.WriteObject(_Stream, instance); 
    _Stream.Position = 0; 
    using (StreamReader _Reader = new StreamReader(_Stream)) 
    { return _Reader.ReadToEnd(); } 
    } 
} 

Пожалуйста, смотрите этот ответ для примеров для XML:

https://stackoverflow.com/a/17055641/351383

Смежные вопросы