2012-10-31 78 views
1

我需要知道如何使用XML(至少有一種我使用的語言(最好是WebMatrix C#),但我曾嘗試做這在過去是JavaScript的幾次,但沒有一個在線示例(以StackOverflow或其他方式)足以讓它爲我工作(請記住,我沒有真正的XML體驗,我當然在XPath上完成了簡單的教程,XML等,但我們都知道這些教程的簡短和不完整)。如何使用XML與WebMatrix剃鬚刀(C#)

我現在想在WebMatrix C#中這樣做,因爲在服務器端處理它似乎更容易管理,並且對用戶來說更快。

當我試圖用一些使用此代碼網上給出的例子:

@using System.Xml.Linq 
@{ 
    var file = XDocument.Load(Server.MapPath(@"/App_Code/Test.xml")); 
    var results = from e in file.Root.Elements() 
     select new { Name = e.Element("someValue").Value, Sales = e.Element("someValueTwo").Value }; 
    var grid = new WebGrid(results); 
} 

(我並不真的需要使用的WebGrid可言,它只是在本例中) 和測試保存在名爲Test.xml的App_Code文件夾中的xml文檔。

嘗試從xml文檔中的兩個字段讀取一些測試值時出現錯誤。下面是測試XML文檔:

<?xml version="1.0" encoding="utf-8" ?> 
<someNode> 
    <someValue>HEY THERE! I'M XML!</someValue> 
    <someValueTwo>Another Value</someValueTwo> 
</someNode> 

這裏是我嘗試的值在CSHTML文件進一步降下來到頁面:

<p>This should be a fun test!<br/>And the value is...: 
     @foreach(var f in results) 
     { 
      <div>@f.Name</div> 
      <div>@f.Sales</div> 
     } 
    </p> 

最後,這裏是我得到時錯誤我運行頁面(記住,沒有其它數據,代碼或文件[CS或以其他方式]關於本次測試或使用XML在我的網站的任何地方存在的話):

Object reference not set to an instance of an object. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object. 

Source Error: 


Line 4:  var file = XDocument.Load(Server.MapPath(@"/App_Code/Test.xml")); 
Line 5:  var results = from e in file.Root.Elements() 
Line 6:   select new { Name = e.Element("someValue").Value, Sales = e.Element("someValueTwo").Value }; 
Line 7:  var grid = new WebGrid(results); 
Line 8: } 

(6號線是行錯誤)

我錯過了什麼?這些例子表現得像這樣簡單,但obv。不是這樣。

誠實地說,我已經充分了解了WebMatrix在不使用XML的情況下完成我的目標(我總是可以使用數據庫,或者渲染頁面等),但我對這種標記語言感到厭倦無情地躲過我,只是因爲我無法用我使用的任何語言(JavaScript,jQuery,C#)的XML文件讀取。

回答

2

我發現使用XmlDocument,XmlNodeXmlNodeList類,並使用XPath指定了我想要的元素,我獲得了更多的成功。但是,這要求您對XML文件的結構有一定的瞭解。

var file = XmlDocument.Load(Server.MapPath(@"/App_Code/Test.xml")); 
var results = file.SelectNodes("someNode/*") 

此設置results是含有的someNode所有子節點一個XmlNodeList。您可以迭代通過results作爲XmlNodes的List。然後,您可以在每個節點上執行與第2行中使用的查詢類似的XPath查詢以獲取子節點。

XPath語法:http://msdn.microsoft.com/en-us/library/aa926473.aspx

我使用C#,而不是VB.net爲以下道歉,但我不熟悉VB的語法一個foreach

foreach(XmlNode aNode in results){ 
    string value = aNode.InnerText 
} 

會給你「嘿!我是XML!「爲someValue節點。\

編輯:試試這個,基於我在下面我的評論鏈接:

@using System.Xml.Linq 
@{ 
    var file = XmlDocument.Load(Server.MapPath(@"/App_Code/Test.xml")); 
    var results = file.SelectNodes("someNode/*"); 
     select new { Name = e.Element("someValue").Value, Sales = e.Element("someValueTwo").Value }; 
    /*Do something with each node*/ 
    foreach(XmlNode aNode in results) 
    { 
     string value = aNode.InnerText 
    } 
} 
+0

哦,不用擔心,我不會用VB.net兩種。我也使用C#,好奇你爲什麼以爲我用VB,但我喜歡你的答案,如果你用這種方法取得了更大的成功,我會理解的。似乎更有意義,至少對我來說。 – VoidKing

+0

我不認爲這在WebMatrix中是這樣工作的......感謝您的嘗試,但:)) – VoidKing

+0

智能感知在這裏沒有看到某些方法(這意味着它們要麼是不存在的,要麼是非導入的,或者超出了範圍) – VoidKing