C言語でXMLの中のデータをランダムに参照しようとしていますが、
なにせ、これまで全然XMLと無縁だったので、理解できないところがあります。
まず、XML Path Language (XPath)を使うべきかそれともDOMでしょうか。
要はXPathとDOMはどういう関係でしょうか。
同時に使うべきかそれとも排他的関係でしょうか。
開発環境:MS WINDOWS XPで ビジュアルstidio VC2010
宜しくお願いします
XPathを使うべきか それともDOM?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: XPathを使うべきか それともDOM?
C言語からDOMとXPathはどうやって使う予定でしょうか? 利用するライブラリ/APIを教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
らん
Re: XPathを使うべきか それともDOM?
ごめんなさい!
恥ずかしいですけれども、何APIですら分かりません。
基本はフリーAPIでいいと思います。
開発環境はMS VISUAL STUDIO VC2010 で、C#を利用する予定はありません。
適当なAPIをご紹介いただければ助かります。
_(._.)_
恥ずかしいですけれども、何APIですら分かりません。
基本はフリーAPIでいいと思います。
開発環境はMS VISUAL STUDIO VC2010 で、C#を利用する予定はありません。
適当なAPIをご紹介いただければ助かります。
_(._.)_
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: XPathを使うべきか それともDOM?
C++ならクラスを使って幾つかライブラリがあるみたいですが、C言語だと私は「Parsifal XML Parser」ぐらしか使ったことがありません。
http://www.saunalahti.fi/~samiuus/toni/xmlproc/
使い方はDOMでもXPathでもありません。
C++であればXPathやDOMは利用可能なライブラリがありますね。申し訳ないですが使ったことがないので使い勝手はわかりません。
「デベロッパーズコーナー:DOMプログラミング講座 III(1)-1 - XML Square」
http://www.utj.co.jp/xml/dev/dom/dxdom1_1.html
「Xerces-C++ XML Parser」
http://xerces.apache.org/xerces-c/
「TinyXPath : tiny C++ XPath プロジェクト日本語トップページ - SourceForge.JP」
http://sourceforge.jp/projects/sfnet_tinyxpath/
http://www.saunalahti.fi/~samiuus/toni/xmlproc/
使い方はDOMでもXPathでもありません。
C++であればXPathやDOMは利用可能なライブラリがありますね。申し訳ないですが使ったことがないので使い勝手はわかりません。
「デベロッパーズコーナー:DOMプログラミング講座 III(1)-1 - XML Square」
http://www.utj.co.jp/xml/dev/dom/dxdom1_1.html
「Xerces-C++ XML Parser」
http://xerces.apache.org/xerces-c/
「TinyXPath : tiny C++ XPath プロジェクト日本語トップページ - SourceForge.JP」
http://sourceforge.jp/projects/sfnet_tinyxpath/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: XPathを使うべきか それともDOM?
Windows環境限定ならMSXMLがまず出てくる選択肢かなぁ,と。
読み込むことでDOMツリーが形成されて,そのDOMツリーに対してselectNodesメソッドにXPathを使って対象を選ぶことが出来ます。
とりあえず,昔書いたサンプルがあるので,参考になればと。
読み込むことでDOMツリーが形成されて,そのDOMツリーに対してselectNodesメソッドにXPathを使って対象を選ぶことが出来ます。
とりあえず,昔書いたサンプルがあるので,参考になればと。
Re: XPathを使うべきか それともDOM?
MSXML6のサンプル書いてみました。
# CoCreateInstanceでE_NOINTERFACEが出ている原因が,IID_IXMLDOMDocumentをIID_IXMLDocumentと書き間違えていることに気づかず時間を無駄にした……。
まず,XML。とりあえず,名前はtest.xmlとします。
こいつは実行ディレクトリにコピーしておきます。ビルド後イベントに,
とでも書いておけばよいでしょう。
次に,Cの場合のコード。
COMまわりの初期化と後処理が面倒なくらいで,それほど難しくないかと。
# QueryInterfaceしてキャストするようなことをしていないから,というのもありますが。
COBJMACROSで隠蔽していますが, は と等価です。
次に,C++の場合のコード。
スマートポインタにT**への変換は邪道な気もしますが,コードが楽になるので書いてしまっています。
# .NETのマーシャリングのように,HRESULTと出力引数から失敗時は例外,戻り値が出力引数,みたいなことができるとコードは簡易になるのだけれど……。
なお,C/C++どちらのコードもエラー処理を一切していません。
実コードでは,エラー処理をする必要があります。
# CoCreateInstanceでE_NOINTERFACEが出ている原因が,IID_IXMLDOMDocumentをIID_IXMLDocumentと書き間違えていることに気づかず時間を無駄にした……。
まず,XML。とりあえず,名前はtest.xmlとします。
<?xml version="1.0" encoding="utf-8"?>
<books>
<book isbn="9784320026926">
<title>プログラミング言語C 第2版 ANSI規格準拠</title>
<authors>
<author>B.W.カーニハン</author>
<author>D.M.リッチー</author>
</authors>
<translators>
<translator>石田晴久</translator>
</translators>
</book>
<book isbn="9784756118950">
<title>プログラミング言語C++</title>
<authors>
<author>Bjarne Stroustrup</author>
</authors>
<translators>
<translator>長尾高弘</translator>
</translators>
</book>
</books>
次に,Cの場合のコード。
► スポイラーを表示
# QueryInterfaceしてキャストするようなことをしていないから,というのもありますが。
COBJMACROSで隠蔽していますが, は と等価です。
次に,C++の場合のコード。
► スポイラーを表示
# .NETのマーシャリングのように,HRESULTと出力引数から失敗時は例外,戻り値が出力引数,みたいなことができるとコードは簡易になるのだけれど……。
なお,C/C++どちらのコードもエラー処理を一切していません。
実コードでは,エラー処理をする必要があります。
-
らん
Re: XPathを使うべきか それともDOM?
皆さん親切なご指導ありがとうございます。
コードまで示されて、非常に勉強になります。
ただ、自分も調べてみましたが、
「C++/CLI で作っているのであれば、System.Xml.XmlDocument を使えばよい、
そうではない場合は、MSXMLを検討するのがよい」という表現もありまして、
ご解説お願いできますか。
またどうぞ宜しくお願いします。
コードまで示されて、非常に勉強になります。
ただ、自分も調べてみましたが、
「C++/CLI で作っているのであれば、System.Xml.XmlDocument を使えばよい、
そうではない場合は、MSXMLを検討するのがよい」という表現もありまして、
ご解説お願いできますか。
またどうぞ宜しくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: XPathを使うべきか それともDOM?
C++/CLIはC++の.NET版でC++を更に拡張した言語です。らん さんが書きました:皆さん親切なご指導ありがとうございます。
コードまで示されて、非常に勉強になります。
ただ、自分も調べてみましたが、
「C++/CLI で作っているのであれば、System.Xml.XmlDocument を使えばよい、
そうではない場合は、MSXMLを検討するのがよい」という表現もありまして、
ご解説お願いできますか。
またどうぞ宜しくお願いします。
らんさんは、使う言語をC言語かC++かC++/CLIを決めなければいけません。後ろに行くほど難しい言語です。
ちなみに、C言語であればMSXMLで構わないと思います。
※ 私がMSXMLを使っていないのは古いOSのバージョンでMSXMLを使うのは問題があったから。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: XPathを使うべきか それともDOM?
C++/CLI なら確かに XmlDocument の方が楽なんですが (COM まわりのあれやこれやが全部不要になる),根本的に C++/CLI を使う必要性がほとんど無いです。らん さんが書きました:「C++/CLI で作っているのであれば、System.Xml.XmlDocument を使えばよい、
そうではない場合は、MSXMLを検討するのがよい」という表現もありまして、
C++/CLI 単体 .NET Framework のアプリケーションを書くならば,圧倒的に C# や Visual Basic のほうが楽ですし,Windows API などは Platform 呼び出し (P/Invoke) があるので C++/CLI の出番は普通ありません。
既存資産があっても DLL 化すれば P/Invoke が使えるのでそれで大抵は片が付きます。
速度を理由に一部を C or C++ で書きたい場合でも,結局は P/Invoke が使えます。
現実的には,C++/CLI が役に立つのは C# or VB と「非常に大きな既存資産」(P/Invoke の宣言が非常に膨大になる) 場合程度に限られるのではないかと。
# VS 2012 Express for Desktop からは C++ の Windows フォームアプリケーションのプロジェクトが消えましたし,Windows 8~の WinRT では C++/CX という別の拡張を使うことになります。