Visual C#の XPathで XMLを分解するには XmlNamespaceManagerがいるみたい

3日ぐらい悩んだのでメモ。
Yahoo!知恵袋Web APIを使用してみようと思ったけど、XPathにそのまま読み込ませてもXMLが生成されずに0件で利用できませんでした。
色々と調べてみると、XmlNamespaceManager を使用した名前空間の管理と言う記事に引っかかり解決。

XmlNamespaceManager 1.png
やろうとしていた事はこんな感じで、右のtextBox1にある文字列を、必要な物だけ左のtextBox2に移動してみたいという物。
使用したXMLファイルは「ヒキコモリ」で検索した結果です:questionSearch.xml

まずは何も考え無しに、下記のようなコードを書いて実行。

string XMLHTML = textBox1.Text;
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(XMLHTML);
XmlNodeList nodeList = xmlDocument.SelectNodes("/ResultSet/Result/Question");

名前空間無しならこれでも取得できるんですが、名前空間があるとこれを実行しても、まったくもって結果は手に入りませんでした。

そのためXMLより名前空間を目視で確認。XPathで使用する際は、XmlNamespaceManagerでマッピングしてあげればいけるとか。
Yahoo!知恵袋の場合は下の赤い奴になります。

<ResultSet xmlns="urn:yahoo:jp:chiebukuro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:chiebukuro:questionsearch http://chiebukuro.yahooapis.jp/Chiebukuro/V1/questionSearchResponse.xsd" totalResultsReturned="10" totalResultsAvailable="227" firstResultPosition="1">

これをコードに組み込んであげれば、XPathでXMLを分解できます。

string XMLHTML = textBox1.Text;
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(XMLHTML);
XmlNamespaceManager NsManager = new XmlNamespaceManager(xmlDocument.NameTable);
NsManager.AddNamespace("xsi", "urn:yahoo:jp:chiebukuro");
XmlNodeList nodeList = xmlDocument.SelectNodes("/xsi:ResultSet/xsi:Result/xsi:Question", NsManager);

XmlNamespaceManager 2.png
実行すると意図したとおりに動き、ようやく私でも料理できる感じになりました。
作成したソース一覧はこちら:Form1.cs

たったこれだけの事なんですが、頭悪いのでかなり悩みました。
作業用BGMをかけたら壮大すぎて作業どころじゃ無かったのもありますが。 (ぇw
次はASP.NETあたりに挑戦予定です。ただし予定は未定です。

プログラムを作ろう! Microsoft Visual C# 2010 入門 (MSDNプログラミングシリーズ)プログラムを作ろう! Microsoft Visual C# 2010 入門 (MSDNプログラミングシリーズ)
池谷 京子

日経BP社 2010-11-11
売り上げランキング : 97292

Amazonで詳しく見る
by G-Tools

| コメント(0) | トラックバック(0) |
■Yahoo!オークション おすすめ商品■
Web Services by Yahoo! JAPAN

トラックバック(0)

トラックバックURL: http://type-y.com/mt/mt-tb.cgi/1816

コメントする