LINQ to XMLにおいて、名前空間を含んだ要素名をXNameとして指定する方法
学類誌WORDの記事、「LINQ in C# 3.0」のVol.3を書いております。
LINQ to XMLにおいて、名前空間を含んだ要素名をXNameとして指定する方法です。なんだかよくわからない日本語。
例
単純に、
<Persons> <Person> <Name>Hiroyuki Inoue</Name> <Belong>Univ. of TKB</Belong> </Person> </Persons>
のようなXMLの場合、名前(PersonのName)指定してそいつの所属(Belong)を取ってくる場合、
XDocument doc = XDocument.Load( "hoge.xml" ); var qy = from person in doc.Root.Descendants( "Person" ) where person.Element( "Name" ).Value == "Hieoyuki Inoue" select person.Element( "Belong" ).Value;
とかやりますが、このXML要素に名前空間が指定されているときはどうしたらいいでしょう。例えば名前空間が「abc」とか定義されてると、XMLは
<abc:Persons> <abc:Person> <abc:Name>Hiroyuki Inoue</abc:Person> <abc:Belong>Univ. of TKB</abc:Belong> </abc:Person> </abc:Persons>
とかなる訳です。ここから先ほどと同じようなクエリを書くと、
var qy = from person in doc.Root.Descendants( "abc:Person" ) ...
とかやっちゃいそうになります(私は最初こう書きました)。しかし「abc」は名前空間なので、
XNamespace ns = "http://www.inohiro.net/schemas/abc";
と宣言して、これを用いて
var qy = from person in doc.Root.Descendants( ns + "Person" ) ...
と書かないといけません。
無駄に冗長に書いてみました。