2013-07-04 27 views
1

我已經搜索,但找不到任何類似的東西,因爲這可能非常基本。我基本上是試圖從xml文件中讀取電影列表,然後將其傳回模型中以進行各種類型的消費。但是我得到一個「System.NullReferenceException:對象引用未設置爲對象的實例。」我(須藤)C#代碼看起來是這樣的將xml元素綁定到MVC4中的模型

 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

你爲什麼不使用序列? – Vismari

+0

我還是新來的.net/c#,還沒有得到那麼多。那會是實現我所需要的最有效的方式嗎? – totalnoob

+0

看看這個:http://stackoverflow.com/questions/364253/how-to-deserialize-xml-document 我認爲這是對你的問題 – Vismari

回答

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; 
} 

希望幫助

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.exe工具使用.NET的xmlserialization功能。你的xml文件是否遵循一個通用的xsd模式。如果他們不用,不用擔心,您可以使用xsd.exe(它的Visual Studio的一部分)爲您的xml文件創建一個公共架構。一旦從示例xml文件生成了xsd文件,就可以使用該xsd文件使用相同的xsd.exe工具生成類。

一旦完成,您可以將生成的一個或多個類作爲成員添加到模型中,按照您認爲合適的方式進行包裝,然後使用幾行代碼將數據從xml文件批量加載到成員類中。只要它符合所述xsd文件,這將適用於任何xml文件。您還可以使用序列化程序類將數據裝載到xml文件或從類中卸載數據。

有很多方法可以做你正在談論的,我已經嘗試了很多方法。但是,這是迄今爲止最好的方式,因爲它允許您加載任意多個不同的xml文件,而無需重寫加載xml的方法(同樣,只要您加載的內容符合xsd文件)。

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

+0

沒什麼太瘋狂,只需要從一個文件加載項目,現在只是電影。 – totalnoob

+0

從第一個鏈接,我已將我的代碼更改爲XmlNodeList MovieXML = xmlDoc.GetElementsByTagName(「movie」);和for(int i = 0; i totalnoob

+0

讓我知道如果上述不適合你。如果確實如此,我們將不勝感激! – Killingsworth

相關問題