2016-11-30 26 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; 
} 

誰かが私を助けてください。すべての名前は大文字XML内の機密であるため、その後もAttributes["MenuID"].ValueAttributes["MenuId"].Valueを変更

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

+0

可能性のある重複した[何がありますNullReferenceException、どうすれば修正できますか?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+1

XMLでは 'MenuId'があなたのコードに含まれています。 –

+0

トーマス、あなたは正しいです。 –

答えて

0

使用してXML LINQ:の名前 "MenuI D" を属性に

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

あなたは、親レベルでMenuを検索し、その下のすべてのMenuのノードを選択するために、単純なXPathクエリを使用することができます。

+0

偶然、誰かがdownvoteボタンを傾けていましたか?私のソリューションは動作しますが、実際にテストしたので、なぜですか?おかげさまで –

1

は、注意してください、ではない "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つのみ。良い仕事をし続ける! –

関連する問題