【问题标题】:binding xml elements to model in MVC4将 xml 元素绑定到 MVC4 中的模型
【发布时间】:2013-07-04 16:35:58
【问题描述】:

我已经搜索过但找不到类似的东西,因为这可能是非常基本的。我基本上是在尝试从 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>

【问题讨论】:

  • 为什么不用序列化?
  • 我还是 .net/c# 的新手,还没有走那么远。这会是实现我需要的最有效的方式吗?
  • 看看这个:stackoverflow.com/questions/364253/…我想这就是你问题的答案

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


【解决方案1】:

如果您的 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;
}

希望有帮助

【讨论】:

    【解决方案2】:

    如果您只打算从 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

    【讨论】:

    • 没什么太疯狂的,只需要从一个文件加载项目,现在只是电影。
    • 从第一个链接开始,我将代码更改为 XmlNodeList MovieXML = xmlDoc.GetElementsByTagName("movie");对于 (int i = 0; i
    • 如果上述方法不适合您,请告诉我。如果是这样,将不胜感激一个赞成和正确的答案!
    • 我测试了我在上面发布的内容。它完全按照您的描述工作。
    • 这很好用,还有一个问题。如果我在课堂上还有一件事,让我们说 public int id { get;放; } 并且 xml 文件有 1,我如何也将 id 添加到 movieModel.Movies.Add(new Movie(){movie = element.InnerText});
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多