C++ × libxml
libxmlを初めて使った。
しかもCで。。。
これまでperlでXMLのパースをやってたのはなんだったのかと思うほど複雑だった・・・
とりあえず、libxmlの公式のページにパースとかリーダーとかのサンプルが置いてあるから、
それを持ってきて、自分なりに斜めに読んでみた。
libxml公式
perlでパースとかしたりしたって言ったけど、ほんとパースして値を表示して遊んだくらいで
XMLがなんたるものかとか全然よくわかってない
パースって言葉だってあいまいだ。
公式のサンプルでparse1.cとかよくわからんから、
一番とっつきやすかった、reader1.cとかを見てみた。
これならわかりやすい。(自分的にはわかりやすいと思った、今回そんな高度なことするわけでもないし・・・、この程度でいいかなと・・・)
reader1.cはまぁ、XMLを読み込んで、そいで
...とかなってるのは中で40文字以上でその先省略とかってしてる。
だから、pase1.cとか読むよりかはこっちのほうが、もう値を取れる状態まで行ってるから(あらわれてるから)そこを工夫してほしいものに近付けるのが楽かなぁとかって思って
Cじゃ難しいが、C++ならなんのことはない
とかって思ってたんだけど(C++のstring型という便利なアレさえあれば・・・と)
printf("%s",value);
なんだ、
ここに値出てるなら、
string buf;
buf += value;
でやってやりゃ、最後にbufの中にほしいものが入ってるじゃないかとか思ったら・・・
良いと思う。
独習C++ 第3版 [本]
しかもCで。。。
これまでperlでXMLのパースをやってたのはなんだったのかと思うほど複雑だった・・・
とりあえず、libxmlの公式のページにパースとかリーダーとかのサンプルが置いてあるから、
それを持ってきて、自分なりに斜めに読んでみた。
libxml公式
perlでパースとかしたりしたって言ったけど、ほんとパースして値を表示して遊んだくらいで
XMLがなんたるものかとか全然よくわかってない
パースって言葉だってあいまいだ。
公式のサンプルでparse1.cとかよくわからんから、
一番とっつきやすかった、reader1.cとかを見てみた。
これならわかりやすい。(自分的にはわかりやすいと思った、今回そんな高度なことするわけでもないし・・・、この程度でいいかなと・・・)
reader1.cはまぁ、XMLを読み込んで、そいで
xmlTextReaderDepth(reader), xmlTextReaderNodeType(reader), name, xmlTextReaderIsEmptyElement(reader), xmlTextReaderHasValue(reader));
このへんの情報を表示してる。
結果こんなん、4 1 Medium 0 0 5 3 #text 0 1 http://a248.e.akamai.net/f/248/37952/1d/... 4 15 Medium 0 0 4 14 #text 0 1 3 15 Image 0 0 3 14 #text 0 1 3 1 Review 0 0 4 14 #text 0 1 4 1 Rate 0 0 5 3 #text 0 1 5.00 4 15 Rate 0 0 4 14 #text 0 1 4 1 Count 0 0 5 3 #text 0 1 1 4 15 Count 0 0 4 14 #text 0 1
...とかなってるのは中で40文字以上でその先省略とかってしてる。
だから、pase1.cとか読むよりかはこっちのほうが、もう値を取れる状態まで行ってるから(あらわれてるから)そこを工夫してほしいものに近付けるのが楽かなぁとかって思って
Cじゃ難しいが、C++ならなんのことはない
とかって思ってたんだけど(C++のstring型という便利なアレさえあれば・・・と)
printf("%s",value);
なんだ、
ここに値出てるなら、
string buf;
buf += value;
でやってやりゃ、最後にbufの中にほしいものが入ってるじゃないかとか思ったら・・・
const xmlChar *name, *value;
何!
xmlChar
そんな馬鹿な・・・
もちろん、上の記述ではコンパイラに怒られた。
xmlCharっていったい何者かと、
libxmlの公式のAPI menuとか見ても・・・、よくわからんし・・・
そんな中でどっかでちらっとみた、
xmlCharなんて、キャストしてc_str()で余裕だぜってのがあったが・・・
本当か・・・
と思って試したがならず・・・
そもそもキャストに関してもこんな記述でいいのかと、
記述自体を疑ったりもした。
まぁ、キャストしようにも元→キャスト後の「元」がわからないのだから・・・
行き詰った・・・
そこで、
これは!
これならいけるかもしれない・・・
const char* kari = reinterpret_cast(value);
warning出たけど通った!!
まぁlibxmlのパッケージ関連でwarning出てんだからいいや。
けど・・・
reinterpret_castは単なる型変更であり、たとえ派生関係があったとしてもポインタのアドレス自体はキャスト前と変わりません。
その意味でreinterpret_castは非常に危険なキャストといえるでしょう。
なに!
なんということか・・・
まぁ、危険なんて、重々承知ー
前途洋々だしー
良いと思う。
独習C++ 第3版 [本]
コメント
コメントを投稿