1

私が構築しているアプリケーションの一部は、XML ドキュメントから robots.txt ファイルを生成する必要があります。

私は次のような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 = "*" の "Items" を選択するにはどうすればよいですか?

つまり、親ノードが特定の値に等しい場合にのみ、子ノードを選択したいと考えています。親ノードの値は一意になります。

ASP.net で C# を使用しています。

4

2 に答える 2

4

次のようなものが必要なようです。

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

from2 番目は結果を平坦化するために使用されるため、シーケンスのシーケンスではないことに注意してください。

または:

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"));

UserAgent単一の要素の下に複数の要素がある場合、同じ結果が得られないことに注意してくださいUserAgents

(ところで、XML スキーマを変更することはできますか? これを単純化できるはずです...)

于 2012-05-01T13:50:31.653 に答える
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;
于 2012-05-01T13:50:07.563 に答える