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