2016-11-30 308 views
0

這是我的XML字符串。從XML獲取屬性值

<?xml version="1.0" encoding="UTF-8"?> 
<Menu TextField="Menu" NavigateUrlField="/#" MenuID="74"> 
    <Menu TextField="Assets" NavigateUrlField="/Assets" MenuID="1870" /> 
    <Menu TextField="Asset Category" NavigateUrlField="/AssetCategory" MenuID="1871" /> 
    <Menu TextField="Asset Location" NavigateUrlField="/AssetLocation" MenuID="1872" /> 
</Menu> 

我需要從這個XML獲取TextField和MenuId。只能從根菜單標記下面的菜單標記。

Text Field    MenuId 
------------------------------- 
Assets     1870 
Asset Category   1871 
Asset Location   1872 

我想下面的代碼,但不工作:

var xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 

XmlNodeList elemList = xmlDoc.GetElementsByTagName("Menu"); 
for (int i = 0; i < elemList.Count; i++) 
{ 
    string menuId = elemList[i].Attributes["MenuID"].Value; 
    string textField = elemList[i].Attributes["TextField"].Value; 
} 

請幫助我的人。

+0

的可能的複製[什麼是NullReferenceException,以及如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+1

請注意您的MenuID' XML,但代碼中含有'MenuId'。 –

+0

托馬斯,你是對的。 –

回答

0

使用XML LINQ:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      XElement menu = doc.Element("Menu"); 
      var results = menu.Descendants("Menu").Select(x => new { 
       textField = (string)x.Attribute("TextField"), 
       menuID = (int)x.Attribute("MenuID") 
      }).ToList(); 
     } 
    } 
} 
+0

謝謝。這幫了我。 –

-1

您可以使用一個簡單的XPath查詢找到Menu在母公司層面,然後選擇下面的所有Menu節點:

XmlNodeList elemList = xmlDoc.SelectNodes("Menu/Menu"); 

隨後還更改Attributes["MenuId"].ValueAttributes["MenuID"].Value,因爲所有的名字都在的情況下XML敏感。

+0

有人偶然傾斜downvote按鈕?我的解決方案有效,我實際測試過,爲什麼? –

1

請注意,你屬性名稱 「MenuI d」,而不是 「MenuI d

XmlNode root = xmlDoc.DocumentElement; 
XmlNodeList elemList = root.SelectNodes("Menu"); 
for (int i = 0; i < elemList.Count; i++) 
{  
    string menuId = elemList[i].Attributes["MenuID"].Value; 
    string textField = elemList[i].Attributes["TextField"].Value; 
} 
+0

聖牛,6個答案中只有1個解釋了實際錯誤,而不是重寫整個代碼。繼續做好工作! –