代码之家  ›  专栏  ›  技术社区  ›  davethecoder

将XML绑定到模型类时卡住

  •  1
  • davethecoder  · 技术社区  · 16 年前

    我正在尝试使用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

    谢谢

    2 回复  |  直到 13 年前
        1
  •  5
  •   Jacob    16 年前

    你需要 反序列化 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文件表示所有员工数据,但视图只显示数据的一个子集或其他结构中的数据,则可能不希望视图模型是数据存储内容的直接副本。

        2
  •  0
  •   csblo    13 年前

    如果要将XML绑定到模型类,可以在codeplex上使用模板。 此外,您还可以对模型类及其子类进行一些处理。

    https://templay.codeplex.com/