- PR -

C言語でのXMLパース

1
投稿者投稿内容
平和主義?
会議室デビュー日: 2004/01/07
投稿数: 6
投稿日時: 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

宜しくお願い致します。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-10-17 15:37
ググってきました。
http://www.asahi-net.or.jp/~kv8s-yjm/another/yja008.htm
C言語でCOMクライアント

ただDOMオブジェクトをCOMで操作しないといけないので非常にめんどくさいコードとなると思います。
XMLを他の形式に変換するのであればXSLTをお勧めします。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-10-17 16:09
こんにちは。

まず、C言語としてコンパイルする場合、
VC++の#import指令は使用することが出来ません。

MSXMLはCOM(ActiveX)ですが、デュアルインターフェイスをサポートしていますので
・カスタムインターフェイス経由
・IDispatchインターフェイス(オートメーション)経由
のどちらかで利用することが出来ます。

カスタムインターフェイスの場合、
C言語では自前でインターフェイス用の構造体を定義をするのが
非常に大変だと思います。MSXMLのCOMオブジェクトの数も結構ありますし。

IDispatchインターフェイス(オートメーション)の場合、
自前ですでに定義されているものが使えるのでインターフェイスを定義する必要はありませんが、
もともとスクリプト用に用意されたインターフェイスなので、
C言語からの使用は、非常に煩雑になってしまいます。


MSXMLはあきらめて、
(存在するのか知りませんが)C言語用のXMLパーサーを探されるのがよいかもしれません。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-10-17 16:22
引用:

Tdnr_Symの書き込み (2007-10-17 16:09) より:
MSXMLはあきらめて、
(存在するのか知りませんが)C言語用のXMLパーサーを探されるのがよいかもしれません。



未検証ですが、検索したらこんなのが見つかりました。探せば他にもあるかもしれません。
The XML C parser and toolkit of Gnome
The Expat XML Parser
SXML: C言語用簡易XML解析ライブラリ
平和主義?
会議室デビュー日: 2004/01/07
投稿数: 6
投稿日時: 2007-10-17 22:35
Anthyhime様、Tdnr_Sym様、レスありがとうございます。

先方の指定により、MSXML以外の使用が認められない為、
がんばってDOMオブジェクトをCOMで操作しようと思います。

以上です。

[ メッセージ編集済み 編集者: 平和主義? 編集日時 2007-10-17 22:35 ]
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-10-18 12:13
引用:

平和主義?さんの書き込み (2007-10-17 22:35) より:

先方の指定により、MSXML以外の使用が認められない為、
がんばってDOMオブジェクトをCOMで操作しようと思います。



MSXML が強制されていて、C++ は不可なんですか?
であれば、今一度 C++ での作成が拒否される理由を明確にしたほうがいいと思いますよ。

作成そのものは不可能ではありませんが、
掲示されたソースを C にすると、多分 3倍くらいに膨れ上がります。

しかも、読みづらいものになるし...
もし、#import など、VC特有の処理を使っているのが理由でというのであれば
それを使わないようにするだけでよいと思うのですが。
#それでも倍近くにはなりそうな気がしますがw

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
1

スキルアップ/キャリアアップ(JOB@IT)