2010-01-16 135 views
4

XML文檔我有類似這樣的XML文檔:搜索與LINQ

<Root> 

    <MainItem ID="1"> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
    </MainItem> 
    <MainItem ID="2"> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
    </MainItem> 

    ... 
</Root> 

我想回到整個基於屬性ID的值MainItem元素。 因此,如果屬性ID等於2,那麼請將該MainItem元素返回給我。

我無法弄清楚如何用LINQ來做到這一點。 谷歌似乎有大量的信息,但我似乎無法找到我正在尋找的東西。

幫助不大?

TIA

:-)

+0

感謝編輯布魯諾! – JustAPleb 2010-01-16 11:19:18

回答

2

這可能是這樣的:

 XDocument doc = XDocument.Load("myxmlfile.xml"); 
     XElement mainElement = doc.Element("Root") 
            .Elements("MainItem") 
            .First(e => (int)e.Attribute("ID") == 2); 
     // additional work 
+1

請注意,如果沒有匹配的元素,對'.First()'的調用將拋出異常。如果你想避免這個異常,那麼使用'.FirstOrDefault()',如果沒有找到,就返回一個NULL值。 – 2010-01-16 11:31:49

+0

會做marc,謝謝。 – JustAPleb 2010-01-16 11:34:40

+1

我會使用'(int)e.Attribute(「ID」)== 2'。 – AnthonyWJones 2010-01-16 11:34:56

0

從這裏:How to: Filter on an Attribute (XPath-LINQ to XML)

// LINQ to XML query 
IEnumerable<XElement> list1 = 
    from el in items.Descendants("MainItem") 
    where (string)el.Attribute("ID") == "2" 
    select el; 

// XPath expression 
IEnumerable<XElement> list2 = items.XPathSelectElements(".//MainItem[@ID='2']"); 
+0

感謝您的幫助!非常感激。 – JustAPleb 2010-01-16 11:32:03

+0

-1用於XpathSelect()。這不是linq的方式。 – 2010-01-29 22:20:50

+0

正如您可能已經注意到的,我剛剛引用了一個關於主題 – 2010-01-29 22:32:27

2

如何:

// load your XML 
XDocument doc = XDocument.Load(@"D:\linq.xml"); 

// find element which has a ID=2 value 
XElement mainItem = doc.Descendants("MainItem") 
          .Where(mi => mi.Attribute("ID").Value == "2") 
          .FirstOrDefault(); 

if(mainItem != null) 
{ 
    // do whatever you need to do 
} 

馬克

+0

的微軟頁面感謝您的幫助!非常感激。 – JustAPleb 2010-01-16 11:34:01

2

我改變你的XML稍微有值:

<?xml version="1.0"?> 
<Root> 
    <MainItem ID="1"> 
     <SubItem>value 1</SubItem> 
     <SubItem>val 2</SubItem> 
     <SubItem></SubItem> 
    </MainItem> 
    <MainItem ID="2"> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
    </MainItem> 
</Root> 

而與此LINQ:

XDocument xmlDoc = XDocument.Load(@"C:\test.xml"); 
var result = from mainitem in xmlDoc.Descendants("MainItem") 
      where mainitem.Attribute("ID").Value == "1" 
      select mainitem; 


foreach (var subitem in result.First().Descendants()) 
{ 
    Console.WriteLine(subitem.Value); 
} 

Console.Read(); 
+0

不錯,謝謝。我認爲我需要在LINQ上得到一本體面的書...要添加到列表中的其他東西;-) – JustAPleb 2010-01-16 11:44:46