XPathの名前空間の扱いが面倒
Product Advertising APIで取得したXMLデータをC#で処理しようとしてはまりました。XPathを使おうと思ってXPathNavigatorを使ってコードを書いたのですけど、Selectメソッドの引数に何を書いても結果がうまく取得できず。使い方は間違っていないはずなのにと思いつつ何度も確認してもなかなか原因が分かりませんでした。
しばらくして気づいたのが名前空間の存在。Product Advertising APIで取得したXMLはデフォルト名前空間を使っていました。Firefoxでデータを表示させてXMLデータを確認していたのですけど、見た目上名前空間がないように見えていたので全然気づきませんでしたよ。
原因が分かってしまえば対処方法を調べるのは簡単で、XmlNamespaceManagerを使うことで解決しました。書いたコードはこんな感じです。
XPathDocument document = new XPathDocument(url); XPathNavigator nav = document.CreateNavigator(); XmlNamespaceManager nsManager = new XmlNamespaceManager(nav.NameTable); nsManager.AddNamespace("a", "http://webservices.amazon.com/AWSECommerceService/2009-03-31"); XPathNodeIterator items = nav.Select("/a:ItemLookupResponse/a:Items/a:Item", nsManager);
これで動くことは動くのですけど、Selectメソッドで毎回名前空間を指定するのが面倒です。デフォルト名前空間的な楽できる方法はないのでしょうか。