私が取り組んでいるアプリケーションでは、XML ファイルからデータを表示する必要があります。いくつかの変換が行われていますが、最終的には最終結果がツリービューに表示されます。ユーザーがノードをクリックすると、リストビューに詳細がポップアップ表示されます。
ノードが選択されていない場合は、基本的に LINQ を使用して、最初に遭遇したアイテムの詳細を取得します。
これが私のXMLの簡略版です
<root>
<parent label="parent1">
<child label="child1">
<element1>data</element1>
<element2>data</element2>
...
</child>
<child label="child2">
<element1>data</element1>
<element2>data</element2>
...
</child>
</parent>
</root>
そして、これを取得するために使用されるコードは次のとおりです (ツリービューが XPathSelectStatement によって設定された親ノードを選択した後):
protected void listsSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
XElement rootElement = XElement.Load(MapPath(TreeSource.DataFile));
rootElement = rootElement.XPathSelectElement("//parent[@label='parent1']");
XElement parentElement;
parentElement = rootElement;
var query = (from itemElement in parentElement.Descendants("child")
select new
{
varElement1 = itemElement.Element("element1").Value,
varElement2 = itemElement.Element("element2").Value,
...
}).Take(1);
e.result = Query;
}
varElement1
これはうまく機能し、そこからとのvarElement2
値を読み取ることができます。しかし、ユーザーが実際にノードを選択したときの同様のメカニズムを実装しようとすると、壁にぶつかるようです。
私のアプローチはXPatchSelectStatement
、実際のノードに到達するために別のものを使用することでした:
parentElement = rootElement.XPathSelectElement("//child[@label='" + tvwChildren.SelectedNode.Text + "']");
しかし、子ノードの下にネストされたすべての要素を読み取るように構築された適切な LINQ クエリを取得する方法について、私はちょっと困惑しています。を使用してみparentElement.Elements()
ましたが、エラーが発生しました。の使用も検討しましNodes()
たが、同様の結果が得られました。
ノードにアクセスするために foreach ループを使用できると思いますが、結果を LINQ クエリに取得する方法がわからないため、同じ結果を返すことができますe.Result = query
。
ご想像のとおり、私はLINQにかなり慣れていないので、ヒントをいただければ幸いです。