1

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

2 回答 2

2

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

编写一个将您的 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;
}

希望有帮助

于 2013-07-04T18:30:06.927 回答
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 文件加载多个节点时需要更大的灵活性,我建议您通过 xsd 使用 .NET 的 xmlserialization 功能.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

于 2013-07-04T16:48:07.790 回答