- - PR -
C言語でのXMLパース
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-10-17 02:00
いつもお世話になっております。
平和主義? と申します。 色々調べてみたのですが、行き詰ってしまいましたので 投稿させていただきました。 当方、C++でMSXMLを使用してXMLファイルをパースし表示する コンソールアプリを作成していましたが、先方の都合により C言語による開発に変更になってしまいました。 しかし、上手くC++からC言語に変換できません。 特にクラスを使用していた部分の変換で行き詰まりました。 C++で作成したソースは以下です。 ----------------------------------------------------- #import "msxml.dll" void main() { // 初期化 CoInitialize(NULL); // 変換定義 USES_CONVERSION; // MSXMLのDOMDocumentを定義 MSXML::IXMLDOMDocumentPtr xmlDoc; // DOMをインスタンス化 xmlDoc.CreateInstance ("MSXML.DOMDocument"); // XMLファイルをDOMDocumentに読込み xmlDoc->load("test.xml"); // XMLのDocumentRootを取得 MSXML::IXMLDOMElementPtr xmlRoot = xmlDoc->documentElement; // NodeListを取得 MSXML::IXMLDOMNodeListPtr xmlNodes = xmlRoot->selectNodes("/ROOT/DATA"); // NodeList件数分処理 long lngNode; xmlNodes->get_length(&lngNode); for(long lngCnt=0; lngCnt < lngNode; lngCnt++ ){ // 該当ノードを取得 MSXML::IXMLDOMNodePtr xmlNode; xmlNodes->get_item(lngCnt,&xmlNode); // 氏名の取得 BSTR bstrText; xmlNode->selectSingleNode("NAME")->get_text(&bstrText); cout << OLE2T(bstrText) << "さんは"; // 誕生年の取得 xmlNode->selectSingleNode("YEAR")->get_text(&bstrText); cout << OLE2T(bstrText) << "に生まれました。\\n"; } // XMLオブジェクトを文字列に変換 BSTR bstrXml; xmlDoc->get_xml(&bstrXml); // 結果出力 cout << OLE2T(bstrXml); } ----------------------------------------------------- これをC言語に書き換えるのは無理なのでしょうか? また、C言語でMSXMLを使用するサンプルなどがあるHPを教えて頂けないでしょうか。 開発環境等 WindowsXP Pro Visual Studio 6.0 SP6 IE 6.0 SP2 MSXML 1〜3 宜しくお願い致します。 | ||||
|
投稿日時: 2007-10-17 15:37
ググってきました。
http://www.asahi-net.or.jp/~kv8s-yjm/another/yja008.htm C言語でCOMクライアント ただDOMオブジェクトをCOMで操作しないといけないので非常にめんどくさいコードとなると思います。 XMLを他の形式に変換するのであればXSLTをお勧めします。 | ||||
|
投稿日時: 2007-10-17 16:09
こんにちは。
まず、C言語としてコンパイルする場合、 VC++の#import指令は使用することが出来ません。 MSXMLはCOM(ActiveX)ですが、デュアルインターフェイスをサポートしていますので ・カスタムインターフェイス経由 ・IDispatchインターフェイス(オートメーション)経由 のどちらかで利用することが出来ます。 カスタムインターフェイスの場合、 C言語では自前でインターフェイス用の構造体を定義をするのが 非常に大変だと思います。MSXMLのCOMオブジェクトの数も結構ありますし。 IDispatchインターフェイス(オートメーション)の場合、 自前ですでに定義されているものが使えるのでインターフェイスを定義する必要はありませんが、 もともとスクリプト用に用意されたインターフェイスなので、 C言語からの使用は、非常に煩雑になってしまいます。 MSXMLはあきらめて、 (存在するのか知りませんが)C言語用のXMLパーサーを探されるのがよいかもしれません。 | ||||
|
投稿日時: 2007-10-17 16:22
未検証ですが、検索したらこんなのが見つかりました。探せば他にもあるかもしれません。 The XML C parser and toolkit of Gnome The Expat XML Parser SXML: C言語用簡易XML解析ライブラリ | ||||
|
投稿日時: 2007-10-17 22:35
Anthyhime様、Tdnr_Sym様、レスありがとうございます。
先方の指定により、MSXML以外の使用が認められない為、 がんばってDOMオブジェクトをCOMで操作しようと思います。 以上です。 [ メッセージ編集済み 編集者: 平和主義? 編集日時 2007-10-17 22:35 ] | ||||
|
投稿日時: 2007-10-18 12:13
MSXML が強制されていて、C++ は不可なんですか? であれば、今一度 C++ での作成が拒否される理由を明確にしたほうがいいと思いますよ。 作成そのものは不可能ではありませんが、 掲示されたソースを C にすると、多分 3倍くらいに膨れ上がります。 しかも、読みづらいものになるし... もし、#import など、VC特有の処理を使っているのが理由でというのであれば それを使わないようにするだけでよいと思うのですが。 #それでも倍近くにはなりそうな気がしますがw _________________ // とっちゃん(高萩 俊行)@わんくま同盟 // とっちゃん’Blog // MS-MVP for Developer Tools - Visual C++ // WindowsInstallerの話題はhttp://www.freeml.com/msiまで |
1