Запрос XML-сериализации - PullRequest
2 голосов
/ 11 июня 2010

У меня есть следующий XML, который необходимо десериализовать / сериализовать:

<instance>
<dog>
    <items>
        <item>
            <label>Spaniel</label>
        </item>
    </items>
</dog>
<cat>
    <items>
        <item>
            <label>Tabby</label>
        </item>
    </items>
</cat>
</instance>

Я не могу изменить структуру XML.

Мне нужно отобразить это в следующем классе:

[Serializable, XmlRoot("instance")]
public class AnimalInstance
{
    public string Dog { get; set; }
    public string Cat { get; set; }
}

Я не совсем уверен, с чего начать, не разбирая вручную XML.Я хотел бы сохранить код как можно более кратким.Есть идеи?(и нет, в моем проекте не участвуют кошки и собаки).

Ответы [ 5 ]

6 голосов
/ 11 июня 2010

Простой рабочий пример (для краткости пропущен кот) с использованием System.Xml.Serialization :

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

[XmlRoot("instance")]
public class AnimalInstance {
    [XmlElement("dog")]
    public Dog Dog { get; set; }
}

public class Dog {
    [XmlArray("items")]
    [XmlArrayItem("item")]
    public List<Item> Items = new List<Item>();
}

public class Item {
    [XmlElement("label")]
    public string Label { get; set; }
}

class Program {
    static void Main(params string[] args) {
        string xml = @"<instance>
<dog>
    <items>
        <item>
            <label>Spaniel</label>
        </item>
    </items>
</dog>
</instance>";

        XmlSerializer xmlSerializer = new XmlSerializer(typeof(AnimalInstance));
        AnimalInstance instance = (AnimalInstance)xmlSerializer.Deserialize(new StringReader(xml));
    }
}
2 голосов
/ 11 июня 2010

почему возникает такая проблема при написании специального кода синтаксического анализа?для вашего простого примера может потребоваться меньше кода для использования XDocument:

XDocument xdoc = XDocument.Parse(xml);
AnimalInstance animal = new AnimalInstance()
{
    Dog = xdoc.XPathSelectElement("instance/dog/items/item/label").Value,
    Cat = xdoc.XPathSelectElement("instance/cat/items/item/label").Value
};
1 голос
/ 18 июня 2010

Если вы сомневаетесь в создании классов XML-сериализации, я считаю, что самый простой способ решить эту проблему:

  • сбросить все ваши фиктивные данные в файл XML
  • запустите xsd.exe, чтобы создать файл схемы .xsd
  • запустите xsd.exe в файле схемы, чтобы создать файл класса

Некоторое время назад я написал краткое руководство по этому вопросу в блоге: http://www.diaryofaninja.com/blog/2010/05/07/make-your-xml-stronglytyped-because-you-can-and-its-easy

это занимает меньше минуты, и вы можете легко настроить все оттуда. XSD.exe ваш друг

0 голосов
/ 11 июня 2010

Вы также можете преобразовать XML-документ, используя XSL, в структуру, которая вам нравится, и десериализовать результаты этого преобразования.Но для такой простой структуры вы должны использовать другое решение, подобное тому, которое предлагает Paolo Tedesco.

0 голосов
/ 11 июня 2010

хорошо, вы можете выполнить пользовательскую сериализацию через интерфейс IXmlSerializable, чтобы получить структуру, как вы хотите

...