忍者ブログ
ちょっとは人のためになる事をしないとインターネットコミュニティーの皆様に申し訳がないかと思いながら、自分の備忘録ていどでしかなく、実際の所たいした情報も提供できないでいるブログ
[90] [89] [88] [87] [86] [85] [83] [82] [81] [80] [79]
×

[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

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
09 2019/10 11
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
フリーエリア
最新CM
[02/07 @naoshi65536]
[02/07 忍]
[09/18 とおりすがり]
[06/26 ilmare]
[03/16 とおりすがり]
最新TB
プロフィール
HN:
naoshi
性別:
男性
職業:
ソフトウェア技術者
趣味:
料理
自己紹介:
@naoshi65536 で連絡がつくはずです。
バーコード
ブログ内検索
カウンター
アクセス解析
FX NEWS

-外国為替-