2010-11-09 107 views
9

我在這裏選擇了標題,因爲我的問題是我需要獲取示例中提到的Item節點。 我有以下的XML,並且在使用LINQ查詢時遇到了問題,之前我已經能夠解析XML - 但是我一直堅持這個小時,並希望有人能夠提供幫助。 這裏是我下面的XML數據(例如數據):如何使用LINQ在XML中按名稱獲取元素

<a:entry xmlns:a="http://www.w3.org/2005/Atom"> 
<a:id>98765</a:id> 
<info>Data Catalogue</info> 
    <data> 
    <items> 
      <item> 
       <id>123456</id> 
       <value>Item One</value> 
      </item> 
      <item> 
       <id>654321</id> 
       <value>Item Two</value> 
      </item> 
     <items> 
    </data> 
    <items> 
     <item> 
     <id>123456</id> 
     <value>Item One</value> 
     </item> 
     <item> 
     <id>654321</id> 
     <value>Item Two</value> 
     </item> 
    <items> 
    <a:author> 
    <a:name>Catalogue</a:name> 
    </a:author> 
</a:entry> 

我希望能夠從中提取下項目的項目XML標籤的ID,但是有一個項目標籤與項目項下的數據,我不根本想要這些節點 - 如果這表示爲路徑,我需要root/items/id/id。我已經嘗試了我所知道的所有關於LINQ的知識,所以如果有人可以提供幫助,需要注意的事情,儘管這是基於系統的示例數據 - 格式無法更改,因此這不是一個可接受的解決方案。
我似乎無法確定我要去哪裏錯了 - 我嘗試的每個LINQ表達式都不會返回任何內容,我認爲這個命名空間是一個問題,並且試圖將其整合,但我正在進行循環。
解決方案必須在Silverlight中工作和C#

我曾嘗試以下:

IEnumerable<XElement> nodes = 
element.Elements().Where(e => e.Name.LocalName == "items") 

但是這讓我所有的「項目」,包括下的那些「數據」我不想這些。


如果我做我的XML下面我確實看到了元素的名稱顯示:

XElement element = XElement.Parse(data); 
foreach (XElement node in element.Elements()) 
{ 
    MessageBox.Show(node.Name.LocalName); 
} 

但是當我這樣做,我不能見項目節點名稱在所有 - 我已經檢查了XElement,它確實有節點,當我輸出上面的名稱時,「items」會與info和id一起顯示!

foreach (XElement node in element.Elements("items")) 
    { 
    MessageBox.Show(node.Name.LocalName); 
    } 
+1

我想通了 - 那裏是一片空白的額外命名空間聲明 - 加入一個隱含的命名空間來我的XML,使用的XNamespace,這和它添加到元素名稱解決問題! – RoguePlanetoid 2010-11-09 16:52:12

回答

18

假設element是你<a:entry>元素:

var ids = element.Element("items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 

ElementElements方法返回唯一的直接孩子,不是所有的子孫,所以它不會返回<items>元素是<data>

+1

這不起作用,雖然我認爲它會是我之前用過的那種thijng - 我發現我根本無法從根目錄獲取任何元素,但是我離開的根目錄下有一個值節點在這個例子中,我也無法讀取它 - 如果我查詢後代有​​一些 - 只是不知道發生了什麼。 – RoguePlanetoid 2010-11-09 16:27:55

+0

只要我像我自己的答案一樣考慮命名空間,這是行不通的! – RoguePlanetoid 2010-11-09 16:54:28

+0

你沒有在你的問題中提供這些信息......我用''元素作爲根,並且它工作正常。 – 2010-11-09 17:03:44

6

我在我的XML中有一個空白的NameSpace聲明我沒有注意到,一旦我將它添加到我的代碼它的工作 - 忘記LINQ是非常名字空間ori ented!

XNameSpace ns = "http://example.org/namespace"; 
var ids = element.Element(ns + "items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 
+1

有同樣的問題,這解決了它! – 2016-01-19 13:28:46