2012-05-01 73 views
1

我構建的應用程序的一部分需要從XML文檔生成robots.txt文件。如何在父節點等於LINQ to XML中的特定值時選擇子節點

我有XML像這樣:

<root> 
    <Robots> 
    <UserAgents> 
     <UserAgent>*</UserAgent> 
     <Disallow> 
     <Item>/wibble/</Item> 
     <Item>/wobble/</Item> 
     </Disallow> 
    </UserAgents> 
    <UserAgents> 
     <UserAgent>Google</UserAgent> 
     <Disallow> 
     <Item>/</Item> 
     </Disallow> 
    </UserAgents> 
    </Robots> 
</root> 

我如何可以選擇 「項目」,其中的UserAgent = 「*」?

換句話說,我只想在父節點等於特定值時選擇子節點。父節點中的值將是唯一的。

我在ASP.net中使用C#。

回答

3

聽起來像是你想要的東西,如:

var query = from agent in doc.Descendants("UserAgent") 
      where (string) agent == "*" 
      from item in agent.Parent.Elements("Disallow").Elements("Item") 
      select item; 

注意,第二from只是用來壓平的結果,所以它不是序列的序列。

或者:

var query = doc.Descendants("UserAgent") 
       .Where(agent => (string) agent == "*") 
       .SelectMany(agent => agent.Parent.Elements("Disallow") 
               .Elements("Item")); 

或改變選擇UserAgents「頂」節點,可以避開父步:

var query = doc.Descendants("UserAgents") 
       .Where(agents => (string) agents.Element("UserAgent") == "*") 
       .SelectMany(agent => agent.Elements("Disallow").Elements("Item")); 

注意,這樣做不會給,如果同樣的結果您在單個UserAgents元素下有多個UserAgent元素。

(你能夠改變XML模式,順便說一句,它看起來像你應該能夠簡化這...)

1
var query = from x in doc.Root.Element("Robots").Elements("UserAgents") 
      where (string)x.Element("UserAgent") == "*" 
      from y in x.Element("Disallow").Elements("Item") 
      select y; 
相關問題