将xml元素绑定到MVC4中的模型

时间:2013-07-04 16:35:58

标签: c# asp.net-mvc-4

我已经搜索但找不到类似的东西,因为这可能是非常基本的。我基本上试图从xml文件中读取电影列表,然后将其传递回模型中以用于各种类型的消费。但我得到一个“System.NullReferenceException:对象引用未设置为对象的实例。”我的(sudo)c#代码看起来像这样

        var xmlDoc = new XmlDocument();
        xmlDoc.Load("c:\\movies.xml");
        var movieModel = new MovieSummary();
        var MovieXML = xmlDoc.GetElementsByTagName("movie");
        int i;

        for (i = 0; i < MovieXML.Count; i++)
        {
            movieModel.Movies[i].name = MovieXML[i]["name"].toString();
        }

我的模型看起来像这样

 namespace movies.Models
 {

     public class MovieSummary
     {
         public List<Movie> Movies { get; set; }
     }

     public class Movie
     {
         public string movie { get; set; }
     }
 }

xml文件看起来像

 <movies xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
      <movie>
       <name>The Dark Knight</name>
  </movie>
  <movie>
       <name>Iron Man</name>
  </movie>
 </movies>

2 个答案:

答案 0 :(得分:2)

如果你的xml文件的结构在你的类中通过继承类似,我认为你最好使用XmlSerializer

编写一个函数,将xml反序列化到类中。

public static MovieSummary Deserialize()
{
    XmlSerializer serializer = new XmlSerializer(typeof(MovieSummary));
    TextReader textReader;

    textReader = new StreamReader(pathtoyourxmlfile);

    MovieSummary summary = (MovieSummary)serializer.Deserialize(textReader); 
    textReader.Close();
    return summary;
}

希望有所帮助

答案 1 :(得分:1)

如果您只是要从xml文件中加载电影列表,那不是,您应该查看MSDN上的以下链接: http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.getelementsbytagname%28v=vs.71%29.aspx

这将是该方法的解决方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var xmlDoc = new XmlDocument();
            xmlDoc.Load("c:\\movies.xml");
            var movieModel = new MovieSummary();
            var MovieXML = xmlDoc.GetElementsByTagName("movie");
            movieModel.Movies = new List<Movie>();
            foreach (XmlElement element in MovieXML)
            {
                movieModel.Movies.Add(new Movie(){movie = element.InnerText});                
            }
            //for (i = 0; i < MovieXML.Count; i++)
            //{
            //    movieModel.Movies[i].name = MovieXML[i]["name"].toString();
            //}
        }
    }
}

如果您计划加载除xml文件中的电影以外的任何内容,或者您​​认为从多个xml文件加载多个节点需要更多的灵活性,我建议使用.NET的xmlserialization功能通过xsd.exe工具。您的xml文件是否遵循常见的xsd架构。如果他们不这样做,不要担心,您可以使用xsd.exe(它是visual studio的一部分)为您的xml文件创建一个通用模式。从示例xml文件生成xsd文件后,可以使用该xsd文件使用相同的xsd.exe工具生成类。

完成后,您可以将生成的一个或多个类作为成员添加到模型中,根据需要将它们包装起来,然后使用几行代码将数据从xml文件批量加载到成员类中。这适用于任何xml文件,只要它遵守所述xsd文件即可。您还可以使用序列化程序类将数据加载到xml文件和从类中卸载数据。

有很多方法可以做你正在谈论的事情,我尝试了很多方法。但是,这是迄今为止最好的处理方式,因为它允许您根据需要加载任意数量的不同xml文件,而无需重写加载xml的方法(同样,只要您加载的内容遵循xsd)文件)。

http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.71%29.aspx