- PR -

MSXMLでのValidate結果取得方法について教えてください。

1
投稿者投稿内容
ぱんぷ
会議室デビュー日: 2005/11/02
投稿数: 2
投稿日時: 2006-04-20 17:33
はじめまして。ぱんぷと申します。
XMLの初心者です。

MSXMLをもちいてXMLとスキーマとの妥当性チェックを
行っています。

正常の場合は問題ないのですが、エラー時にエラー箇所の位置を取得したいの
ですが、IXMLDOMParseErrorのlineプロパティを用いても0が返ってきて、
取得できません。
reasonプロパティは取得できるので正常に動作しているように思えるのですが、
どこがいけないのでしょうか??

ソースコードを記述しますので、どなたか分かる方教えてください。

 IXMLDOMDocument2Ptr pDoc = NULL;
 IXMLDOMSchemaCollection2Ptr pXsc = NULL;
IXMLDOMParseErrorPtr pErrObj;

 hr = ::CoCreateInstance( MSXML2::CLSID_DOMDocument40, NULL,
   CLSCTX_INPROC_SERVER, MSXML2::IID_IXMLDOMDocument2, (void**)&pDoc );
 hr = CoCreateInstance( CLSID_XMLSchemaCache40, NULL,
   CLSCTX_INPROC_SERVER, __uuidof(IXMLDOMSchemaCollection), (void**)&pXsc );

 hr = pDoc->load( variant_t("Sample.xml"), &f );
 hr = pXsc->add( bstr_t( "http://www.sample"),
       variant_t("SampleSchema.xsd") ); // S_OKが返ってくる
 hr = pDoc->putref_schemas( variant_t(pXsc) ); // S_OKが返ってくる

 hr = pDoc->validate( &pErrObj ); // エラーが返ってくる

 long line = 0;
 CComBSTR _txt;

 pError->get_reason( &_txt );    // S_OKが返ってくる
                   // _txtにはエラー理由が返ってくる 
 hr = pError->get_line( &line );  // S_OKが返ってくる
                  // なぜか0が返る ???????なぜ?

開発環境はXPpro、C++.NETを用いています。
DLLは”MSXML4.DLL”です。

よろしくお願いします。
      ぱんぷ
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-04-21 01:23
http://members.jcom.home.ne.jp/jintrick/Personal/d20032l.html
には。

3. 検証

IXMLDOMDocument2オブジェクトの

validateメソッドで実際に検証できます。
このメソッドはIXMLDOMParseErrorオブジェクトを返却しますが、

loadメソッドが完了した時点で作成される
IXMLDOMParseErrorオブジェクト(この例ではdoc.parseErrorで参照可能)が
更新されるわけではない点に注意が必要かもしれません。
私はここで引っかかりました。
ーーーーーーーーーーーーーーーーーーーーーーーー
line はわかるものなのだろうか(各nodeにソースのlinenoは入っていた?)。
parseError.srcText の方を表示できる ?

[ メッセージ編集済み 編集者: MMX 編集日時 2006-04-21 01:47 ]
らっこ
会議室デビュー日: 2004/08/10
投稿数: 1
投稿日時: 2006-04-21 17:21
JavaScriptの例ですが、

http://www.atmarkit.co.jp/fxml/tecs/022dom/22.html

によると、

@ドキュメントオブジェクトの生成
var objXml=new ActiveXObject("MSXML2.DOMDocument.4.0");
objXml.async=false;
Aスキーマキャッシュオブジェクトの生成
var objScm=new ActiveXObject("MSXML2.XMLSchemaCache.4.0");
Bスキーマをキャッシュに追加
objScm.add("urn:bookList","book.xsd");
Cスキーマキャッシュとドキュメントの関連付け
objXml.schemas=objScm;
Dドキュメントのロード
objXml.load("book.xml");
Eエラーの確認
var objErr=objXml.parseError;

となっていますよ。
この順序で確認してみたらいかがですか?
幸運を祈ります。

らっこ
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2006-04-21 17:59
とっちゃんです。

load と validate では別々のオブジェクトが帰ってくるので

コード:
MSXML2::IXMLDOMParseErrorPtr ptrParseError;
bool	bError = false;
if( !ptrDocument->load( lpszFilePath ) ){
	bError = true;
	ptrParseError = ptrDocument->GetparseError();
}
else{
	ptrParseError = ptrDocument->validate();
	if( ptrParseError->errorCode != 0 ){
		bError = true;
	}
}
if( bError ){
	// エラーの表示などなど
}


という感じでいけると思います。スマートポインタ使ってるコードですが。



_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
ぱんぷ
会議室デビュー日: 2005/11/02
投稿数: 2
投稿日時: 2006-04-24 16:44
返信が遅くなってすみません。
MMXさま、らっこさま、とっちゃんさま
アドバイスありがとうございました。

記載したコードにあるように、
load, add, putref_schemas, validate の順だと
lineもsrcTextも取得できませんでした。

しかし、add, putref_schemas, load の順に変更したところ
lineもsrcTextも取得できました。

DOMツリーを変更してからvalidateを行おうとすると
lineは取得できないのですね。
とても勉強になりました。

本当にありがとうございました。
     ぱんぷ
1

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