DOBON.NET DOBON.NETプログラミング掲示板過去ログ

LINQ to XML を使用したXML検索

環境/言語:[XP , C#]
分類:[.NET]

名前空間が定義されたXMLファイルについて、
LINQ to XMLクエリを使用して特定の要素を検索するにはどのようにしたらよろしい
でしょうか?

例えば、下記のXMLファイルから要素<EEE>の値を検索したい。

<?xml version="1.0" encoding="utf-8"?>
<aa:TTT xmlns:aa="http://www.test.co.jp">
<aa:EEE>55</aa:EEE>
<aa:SSS>44</aa:SSS>
</aa:TTT>

C#のコード

XElement Xel = XElement.Load("SAMPLE.xml");
var query = from e in Xel.Elements()
select new
{
EEE = e.Element("EEE").Value
};

では名前空間の指定をしていないため失敗…
■No22904に返信(shimさんの記事)
> 例えば、下記のXMLファイルから要素<EEE>の値を検索したい。

C# なら、
 XNamespace aa = "http://www.test.co.jp";
 Console.WriteLine( Xel.Element(aa + "EEE").Value );
かな。


> var query = from e in Xel.Elements()
> select new
> {
> EEE = e.Element("EEE").Value
> };
> では名前空間の指定をしていないため失敗…

xmlns:aa の件が無ければ、このクエリは期待動作しているという事でしょうか?

そもそも Xel.Elements() からは、<aa:EEE> と <aa:SSS> の 2 要素が
列挙されますよね。クエリの意図が良く分からなかったのですが、上記だと
「<aa:EEE>」や「<aa:SSS>」から「<EEE>のテキスト」を得ようという意味に
なってしまうように思えますので、名前空間の件とは、また別の問題を
含んでいるような気がします。

もし、<aa:EEE>のテキストのみを得たいのであれば、
 XNamespace aa = "http://www.test.co.jp";
 var query = from e in Xel.Elements()
 where e.Name == (aa + "EEE")
 select new { EEE = e.Value };
あるいは、
 XNamespace aa = "http://www.test.co.jp";
 var query = from e in Xel.Elements(aa + "EEE")
 select new { EEE = e.Value };
といった所で如何でしょう。
魔界の仮面弁士さん

いつもお世話になっております。


> そもそも Xel.Elements() からは、<aa:EEE> と <aa:SSS> の 2 要素が
> 列挙されますよね。クエリの意図が良く分からなかったのですが、上記だと
> 「<aa:EEE>」や「<aa:SSS>」から「<EEE>のテキスト」を得ようという意味に
> なってしまうように思えますので、名前空間の件とは、また別の問題を
> 含んでいるような気がします。

たしかにご指摘の通りでございます…。
例のXMLファイルが意図するものではありませんでした。
例題の場合、
<?xml version="1.0" encoding="utf-8"?>
<aa:TTT xmlns:aa="http://www.test.co.jp">
<aa:CCC>
<aa:EEE>55</aa:EEE>
<aa:SSS>44</aa:SSS>
</aa:CCC>
</aa:TTT>
のような構造をもつものが対象でした。
動作確認をしていなかったため、
混乱をさせてしまいまして申し訳ございません。


ご助言いただいた方法にて名前空間が指定された要素のデータを
取得することができました。
非常に助かりました。ありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板