inohilog

/var/log/inohiro.log

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

と書かないといけません。


無駄に冗長に書いてみました。