Десериализация XML - PullRequest
       4

Десериализация XML

0 голосов
/ 21 апреля 2011

Я пытаюсь десериализовать некоторые xml, используя следующие xml и классы.Проблема, с которой я сталкиваюсь, заключается в том, что имена элементов xml не совпадают с именами, которые я хотел бы использовать для своих классов.Я пытался использовать XmlRoot для указания имени элемента, но не смог заставить его работать.Любая помощь будет оценена.

<Results recordReturn="3" xmlns="http://www.zzz.com/"> <Result> <key>98937747-0596-42e6-aa5b-e180d35f649e</key> <code>AFGHANISTAN 004 100ab860-f2a5-48ed-911c-31753b79234f ALBANIA 008 67ecc235-d44a-41e0-b2a0-7a9c00e30a0e ALGERIA 012

[Serializable]
[XmlRoot("Result", Namespace = "http://www.zzz.com/")]    
public class Country
{
    public Country()
    { }

    public string key;
    public string code;
    public string number;
}

[Serializable]
[XmlRoot(ElementName = "Results", Namespace = "http://www.zzz.com/")]
public class Countries : System.Collections.CollectionBase
{
    public Country this[int nIndex]
    {
        get { return (Country)this.InnerList[nIndex]; }
    }

    public void Add(Country oCountry)
    {
        this.List.Add(oCountry);
    }
}


//Code below is in separate class file
    public static Countries GetAllCountries()
    {
        XmlNode countriesNode = //omitting code to get country xml
        Countries countryList = new Countries();
        XmlSerializer serializer = new XmlSerializer(typeof(Countries));
        System.Xml.XmlNodeReader oReader = new System.Xml.XmlNodeReader(countriesNode);
        countryList = (Countries)serializer.Deserialize(oReader);

        return countryList;
    }

Ответы [ 4 ]

1 голос
/ 21 апреля 2011

Если вы исправили форматирование и у вас есть действительный XML:

<Results recordReturn="3" xmlns="http://www.zzz.com/">
  <Result>
    <key>98937747-0596-42e6-aa5b-e180d35f649e</key>
    <code>AFGHANISTAN</code>
    <number>004</number>
  </Result>
  <Result>
    <key>100ab860-f2a5-48ed-911c-31753b79234f</key>
    <code>ALBANIA</code>
    <number>008</number>
  </Result>
  <Result>
    <key>67ecc235-d44a-41e0-b2a0-7a9c00e30a0e</key>
    <code>ALGERIA</code>
    <number>012</number>
  </Result>
</Results>

Следующее должно работать нормально:

[XmlRoot("Result")]
public class Country
{
    [XmlElement("key")]
    public string Key { get; set; }
    [XmlElement("code")]
    public string Code { get; set; }
    [XmlElement("number")]
    public string Number { get; set; }
}

public class Results
{
    [XmlAttribute("recordReturn")]
    public int RecordReturn { get; set; }

    [XmlElement("Result")]
    public Country[] Countries { get; set; }
}

class Program
{
    static void Main()
    {
        var serializer = new XmlSerializer(typeof(Results), "http://www.zzz.com/");
        using (var reader = XmlReader.Create("test.xml"))
        {
            var results = (Results)serializer.Deserialize(reader);
            // TODO : exploit the results
        }
    }
}
0 голосов
/ 21 апреля 2011

[XmlRoot] используется только тогда, когда класс используется в качестве корневого элемента документа. Чтобы указать имя элемента, которое будет использоваться в целом, используйте [XmlType].

0 голосов
/ 21 апреля 2011

Помимо попытки вывести атрибуты вручную, менее известной особенностью .Net SDK является то, что xsd.exe может сделать всю работу за вас.В командной строке .Net просто введите:

xsd.exe <name of your schema>.xsd /classes

Это создаст правильные классы сериализации для этой схемы.Если у вас нет схемы, вы можете позволить xsd.exe сгенерировать ее для вас.Просто передайте ему образец XML-файла, подобный тому, который вы указали в качестве аргумента, и он создаст соответствующий файл XSD.

Сгенерированные классы являются частичными, так что вы можете расширить их без необходимости повторного применения всех ваших изменений, если вам случится их регенерировать.

Помимо "/ classes" есть и другие ключи, которые могут прийтиудобно, например, "/ ebd", который создает классы, реализующие INotifyPropertyChanged, или "/ fields", который генерирует простые поля вместо свойств.

0 голосов
/ 21 апреля 2011

XmlSerializer имеет конструктор, который принимает корневой тег для использования.Это должно помочь.Я всегда создавал образцы экземпляров своих классов и сериализировал их.Таким образом, очень легко понять, как настроить сериализацию / десериализацию xml.

...