C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: MSXMLにてXMLの要素取得


(過去ログ 50 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■27563 / inTopicNo.1)  MSXMLにてXMLの要素取得
  
□投稿者/ POPOI (7回)-(2008/11/10(Mon) 10:46:51)

分類:[C/C++] 

C++でのXMLParse処理にて行き詰ってしまいましたので
質問させていただきます。

※Webにてサンプルを和/洋サイトにて調べてコードを書いてみているのですが、メンバ変数/関数が存在していなかったり名前が違っていたりとコンパイルを通すことさえできない状態です。

【質問】
GetItem関数やGettext関数等、Web上ではどのサイトでも当たり前のように使用しているように書いてありますが
実際クラスのメンバの中に存在していません。
#includeの方法や使い方に問題があるのでしょうか?
使用するために前準備などが必要でしたら教えてもらえないでしょうか?

「MSXML4.DLL」を使用してXMLのParseを行いたいと思っています。

サンプルのXMLは以下でconfigのname、typeの値を取得したいと思っています。
【XML】
<?xml version="1.0" encoding="SHIFT-JIS"?>
<sample id="100">
<config name="A" type="1" >test1</config>
</sample>

【Source】

#include "msxml.h"
#import <msxml4.dll> named_guids raw_interfaces_only
using namespace MSXML2;

typedef MSXML2::IXMLDOMNodeListPtr INodeListPtr;
typedef MSXML2::IXMLDOMNodePtr INodePtr;
typedef MSXML2::IXMLDOMElementPtr IElementPtr;

INodeListPtr plNameList;
IElementPtr pElement;
pDoc->get_documentElement( &pElement );
pElement->getElementsByTagName( _bstr_t( L"sample" ), &plName );

long maxElement;
plNameList->get_length( &maxElement );
for( long i=0; i < maxElement; i++ )
{

IElementPtr peName = plNameList->GetItem(i);

// タグ名"name"の要素を取得
IElementPtr peString = peName->getElementsByTagName( _bstr_t( L"name" ) )->GetItem(0);
_variant_t str = peString->Gettext();

// タグ名"type"の要素を取得
IElementPtr peComment = peName->getElementsByTagName( _bstr_t( L"type" ) )->GetItem(0);
_variant_t cmt = peComment->Gettext();

wprintf( L"%s (%s)\n", str.bstrVal, cmt.bstrVal );
}

【環境】
開発環境:VC++2008 MFC スマートデバイス
実行環境:Windows Mobile 6 standard-edition

以上よろしくお願いします。
引用返信 編集キー/
■27566 / inTopicNo.2)  Re[1]: MSXMLにてXMLの要素取得
□投稿者/ aetos (7回)-(2008/11/10(Mon) 11:26:04)
No27563 (POPOI さん) に返信
> C++でのXMLParse処理にて行き詰ってしまいましたので
> 質問させていただきます。
>
> ※Webにてサンプルを和/洋サイトにて調べてコードを書いてみているのですが、メンバ変数/関数が存在していなかったり名前が違っていたりとコンパイルを通すことさえできない状態です。
>
> 【質問】
> GetItem関数やGettext関数等、Web上ではどのサイトでも当たり前のように使用しているように書いてありますが
> 実際クラスのメンバの中に存在していません。
> #includeの方法や使い方に問題があるのでしょうか?
> 使用するために前準備などが必要でしたら教えてもらえないでしょうか?

Gettext や GetItem じゃなくて、get_text とか get_item だったりしませんかね。
COM の場合、VB や C# で言うところのプロパティが、C++ では get_ とか put_ がつくメソッドになります。
引用返信 編集キー/
■27570 / inTopicNo.3)  Re[2]: MSXMLにてXMLの要素取得
□投稿者/ 渋木宏明(ひどり) (944回)-(2008/11/10(Mon) 12:03:21)
渋木宏明(ひどり) さんの Web サイト
>>※Webにてサンプルを和/洋サイトにて調べてコードを書いてみているのですが、メンバ変数/関数が存在していなかったり名前が違っていたりとコンパイルを通すことさえできない状態です。

MSXML のリファレンスは MSDN ライブラリに収録されています。

メンバ名やらの確認をするなら、どこのだれが書いたかわからないサンプルもどきよりもリファレンスを見るべきと思います。

引用返信 編集キー/
■27588 / inTopicNo.4)  Re[3]: MSXMLにてXMLの要素取得
□投稿者/ POPOI (8回)-(2008/11/10(Mon) 19:01:08)
No27566 (aetos さん) に返信
> Gettext や GetItem じゃなくて、get_text とか get_item だったりしませんかね。
> COM の場合、VB や C# で言うところのプロパティが、C++ では get_ とか put_ がつくメソッドになります。

そうなんですね。勉強になりました。
知らないとハマりますね。
ありがとうございます。


No27570 (渋木宏明(ひどり) さん) に返信
> MSXML のリファレンスは MSDN ライブラリに収録されています。
>
> メンバ名やらの確認をするなら、どこのだれが書いたかわからないサンプルもどきよりもリファレンスを見るべきと思います。
>

日本語のMSDNしか見ていませんでした。
英語版のMSDNにはC++用のメソッドの使い方が書いてありますね。
調べなおして進めてみます。
指摘ありがとうございました。
引用返信 編集キー/
■27592 / inTopicNo.5)  Re[4]: MSXMLにてXMLの要素取得
□投稿者/ 渋木宏明(ひどり) (945回)-(2008/11/10(Mon) 21:18:51)
渋木宏明(ひどり) さんの Web サイト
>>Gettext や GetItem じゃなくて、get_text とか get_item だったりしませんかね。
>>COM の場合、VB や C# で言うところのプロパティが、C++ では get_ とか put_ がつくメソッドになります。

ですが、#import によるスマートポインタではまた事情が異なる場合があります。

しかし、つっこむべきところはそんなところではなく

>typedef MSXML2::IXMLDOMNodeListPtr INodeListPtr;
>typedef MSXML2::IXMLDOMNodePtr INodePtr;
>typedef MSXML2::IXMLDOMElementPtr IElementPtr;

のような、「なんちゃってスマートポインタ(的なオレオレ宣言)」にあるます。

このまま書きすすめると、盛大なメモリリークが待ち受けています。

せっかく #import 使うんなら、raw_interface オプションなんかつけないで、素直にスマートポインタを使えばよろしいんじゃないかと思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -