ちょっとは人のためになる事をしないとインターネットコミュニティーの皆様に申し訳がないかと思いながら、自分の備忘録ていどでしかなく、実際の所たいした情報も提供できないでいるブログ
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 ネームスペースが含まれている XML を libxml2 XPath関数で検索する方法
C, C++, Objective-C, libxml2
問題点
XML にネームスペースが含まれている場合に xmlXpathEval で検索できなくなる
解決方法
xmlXpathEval を呼び出す前に、xmlXpathRegisterNs を利用し、ネームスペースを登録する。
xmlXpathRegisterNs は xpathinternals.h に宣言されている。
解説
たとえば、Excel の xml 形式ワークシートは以下のような構造になっている。
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="84" ss:ExpandedRowCount="1" x:FullColumns="1"
<Row ss:Height="102">
<Cell><Data ss:Type="String">製品番号</Data></Cell>
ここでは、ほぼ全ての要素に ss: の urn:schemas-microsoft-com:office:spreadsheet というネームスペースが用いられている。
このようなXMLに対して、1行分のデータを取り出そうとして、下記のような関数呼び出しをしても、なにもマッチしてくれない。要素がグローバルなネームスペースにないからだ。
xmlXPathEval(BAD_CAST "/Workbook/Worksheet[position()=1]/Table[position()=1]/Row[position()=1]/Cell/Data[position()=1]", ctx);
このような場合、xmlXpathEval の前に、xmlXPathRegisterNS を用いてネームスペースを登録する。
xmlXPathRegisterNs(ctx, BAD_CAST "x", BAD_CAST "urn:schemas-microsoft-com:office:spreadsheet");
その後、以下のような式を用いることで検索ができるようになる。
xmlXPathEval(BAD_CAST "/x:Workbook/x:Worksheet[position()=1]/x:Table[position()=1]/x:Row[position()=1]/x:Cell/x:Data[position()=1]", ctx);
ここでは x: を使っているが、どのようなプレフィックスでも構わない。
あえて ssではなく x: を用いて、XMLソースのプレフィックスと、XPathの式でのプレフィックスの違いを確認している。
XML中の xmlns:x= … と xmlXpathEvelの x: は無関係だ。
本来は ss: にするのがわかりりやすいのは言うまでもない。
PR
<<BeagleBoard-xM で遊び始めた
HOME This generally means that another instance of this process was already running or is hung in the debugger>>
|
カレンダー
カテゴリー
フリーエリア
最新CM
[02/07 @naoshi65536]
[02/07 忍]
[09/18 とおりすがり]
[06/26 ilmare]
[03/16 とおりすがり]
最新記事
(01/30)
(01/30)
(08/13)
(05/26)
(04/08)
最新TB
ブログ内検索
カウンター
アクセス解析
|