2009-10-20 88 views
1

我想根據條件查找xml的一部分,因此我使用linq to XML。不幸的是結果總是爲空,所以我想我做錯了。下面顯示的是我正在解析的XML示例。使用Linq找到基於ID的特定XML元素

<Stuff> 
<ItemsA /> 
<ItemsB /> 
<ItemsC> 
    <Item xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Stuff"> 
    <Id>4bd7b5ac-cb29-4d34-97be-deaebe4a5186</Id> 
    <Children> 
    <Item> 
     <Id>22e3ef6b-4321-40c3-9237-196ba527e9ad </Id> 
     <Name>SomeName</Name> 
    </Item> 
    </Children> 
    <Description>SomeText</Description> 
    <Name>NewName</Name> 
</Item>  

我正在尋找的「ItemsC」部分,其中可以存在多個「項」 XML的塊在(只有一個在該示例中示出)。我想根據它的「Id」檢索元素,在上面的例子中,Id是「4bd7b5ac-cb29-4d34-97be-deaebe4a5186」。

我已經使用的代碼如下所示:

的XElement數據= XElement.Parse(的GetFile());

var pbp = (from b in data.Descendants("Item") 
      where b.Element("Id").Value == "4bd7b5ac-cb29-4d34-97be-deaebe4a5186" 
      select b.Element("Id").Parent).FirstOrDefault(); 

pbp始終返回爲空。任何人都可以幫助我產生正確的linq表達。

回答

0

是啊 - 你只是缺少命名空間:

string desiredId = "4bd7b5ac-cb29-4d34-97be-deaebe4a5186"; 
XNamespace ns = "http://schemas.datacontract.org/2004/07/Stuff"; 
var pbp = (from b in data.Descendants(ns + "Item") 
      where b.Element(ns + "Id").Value == desiredId 
      select b).FirstOrDefault(); 

注意,我簡化了b.Element("Id").Parent只是b - 如果你只是把樹砍倒,然後再起來,你還不如留你在哪裏:)

這表明進一步的簡化使用點符號:

string desiredId = "4bd7b5ac-cb29-4d34-97be-deaebe4a5186"; 
XNamespace ns = "http://schemas.datacontract.org/2004/07/Stuff"; 
var pbp = data.Descendants(ns + "Item") 
       .Where(b => b.Element(ns + "Id").Value == desiredId) 
       .FirstOrDefault(); 

如果有機會的元素不會甲肝e表示「ID」元素,那麼你就可以轉換爲字符串,而不是:

string desiredId = "4bd7b5ac-cb29-4d34-97be-deaebe4a5186"; 
XNamespace ns = "http://schemas.datacontract.org/2004/07/Stuff"; 
var pbp = data.Descendants(ns + "Item") 
       .Where(b => (string) b.Element(ns + "Id") == desiredId) 
       .FirstOrDefault(); 

這避免了可能的NullReferenceException。

+0

謝謝,改變現在的作品。時間讓我在Linq上做更多的閱讀:) – Retrocoder 2009-10-20 10:39:09

0

你只需要命名空間添加到查詢,即

XNamespace ns = "http://schemas.datacontract.org/2004/07/Stuff"; 

var pbp = 
    (from b in data.Descendants(ns + "Item") 
    where b.Element(ns + "Id").Value == "4bd7b5ac-cb29-4d34-97be-deaebe4a5186" 
    select b.Element(ns + "Id").Parent).FirstOrDefault();