застряла привязка xml к классу модели

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

однако, будучи все дозвуковым, я застрял в том, как привязать свой xml-документ к классу модели, чтобы затем использовать этот класс для строго типизированных представлений:

вот мой модельный класс:

[XmlRoot("employee")]
public class EmployeesModel
{
    [Required]
    [DisplayName("Name: ")]
    [XmlElement("employeeName")]
    public string employeeName { get; set; }

    [Required]
    [DisplayName("Position: ")]
    [XmlElement("employeePosition")]
    public string employeePosition { get; set; }

    [Required]
    [DisplayName("Description")]
    [XmlElement("employeeDescription")]
    public string employeeDescription { get; set; }

    [Required]
    [DisplayName("Photo: ")]
    [XmlElement("employeePhoto")]
    public string employeePhoto { get; set; }

    [Required]
    [DisplayName("ID: ")]
    [XmlElement("employeeID")]
    public int employeeID { get; set; }
}

и вот мой код:

XDocument xmlDoc = XDocument.Load(Server.MapPath("~/App_Data/employees.xml"));

        var model = (from xml in xmlDoc.Descendants("employee")
                                             select xml) as IEnumerable<EmployeesModel>;

        return View(model);

XML

<?xml version="1.0" encoding="utf-8" ?>
<employees>
<employee>
    <employeeName>David parker</employeeName>
     <employeePosition>Senior Web Developer</employeePosition>
     <employeeDescription>This is a test description<br>feele free to add something here.</employeeDescription>
     <employeePhoto>mypic.jpg</employeePhoto>
    <employeeID>1</employeeID></employee></employees>

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

для ясности я использую asp.net mvc 2 rc 2

Благодарность


person davethecoder    schedule 06.02.2010    source источник


Ответы (2)


Вам нужно десериализовать XML в объекты. Вы не можете просто преобразовать XML в объекты. Когда вы говорите as IEnumerable<EmployeesModel>, вы получите null, так как типы несовместимы. Ваш код может выглядеть примерно так:

var serializer = new XmlSerializer(typeof(EmployeesModel));
var model = 
    from xml in xmlDoc.Descendants("employee")
    select serializer.Deserialize(xml.CreateReader()) as EmployeesModel;

Другой вариант, который вы можете рассмотреть, — это проецировать XElement в объекты EmployeesModel, например:

var model =
    from xml in xmlDoc.Descendants("employee")
    select new EmployeesModel {
        employeeName = (string)xml.Element("employeeName"),
        employeePosition = (string)xml.Element("employeePosition"),
        employeeDescription = (string)xml.Element("employeeDescription"),
        employeePhoto = (string)xml.Element("employeePhoto"),
        employeeID = (int)xml.Element("employeeID"), };

Как видите, это может быть утомительно. Впрочем, может и уместно. Если ваш файл XML представляет все данные о сотрудниках, но ваше представление показывает только подмножество данных или данные в другой структуре, вы, вероятно, не хотите, чтобы ваша модель представления была прямой копией содержимого вашего хранилища данных.

person Jacob    schedule 06.02.2010
comment
как в select new {Model.name = xml.Element(name).value}, и если да, я понимаю, что я просто отменяю модель как новую модель EmployeeModel, верно ??? - person davethecoder; 07.02.2010
comment
спасибо за вашу помощь, это хорошо, но я получаю сообщение об ошибке: ‹employee xmlns=''› не ожидалось. в строке выберите serializer.Deserialize(xml.CreateReader()) as EmployeesModel; я обновил свой пост, чтобы включить XML, если это поможет !!!! думаю, мне нужно сначала установить какой-то цикл, а затем десериализовать каждый элемент как новый EmployeeModel ???? Благодарность - person davethecoder; 07.02.2010
comment
Класс XmlSerializer предполагает прямое сопоставление имен элементов со свойствами. Вы можете украсить свой класс EmployeesModel атрибутами, чтобы описать, как выполнять сопоставление (см. msdn.microsoft.com/en-us/library/83y7df3e(VS.71).aspx). Или вы можете использовать проекцию в своем LINQ вместо XmlSerializer (скоро я добавлю образец). - person Jacob; 07.02.2010
comment
ваше право это работает сразу же, моя ошибка была ‹br /› в моем описании. поскольку это тег xml, поэтому мне просто нужно html-кодировать мои описания перед входом, и все работает как шарм. - person davethecoder; 07.02.2010

Если вы хотите привязать xml к классу модели, вы можете использовать tempplay на codeplex. Далее вы можете выполнить некоторый процесс в своем модельном классе и их дочерних элементах.

https://tempplay.codeplex.com/

person csblo    schedule 22.05.2013