2012-05-01 15 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#を使用しています。二fromはちょうどそれが配列の配列ではないので、結果を平坦化するために使用されていることを

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

注:

答えて

3

はあなたのような何かをしたいような音。また

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スキーマを変更できますか?btw?これを簡略化できるはずです...)

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; 
関連する問題