- - PR -
MSXMLでのValidate結果取得方法について教えてください。
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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”です。 よろしくお願いします。 ぱんぷ | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 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; となっていますよ。 この順序で確認してみたらいかがですか? 幸運を祈ります。 らっこ | ||||
|
投稿日時: 2006-04-21 17:59
とっちゃんです。
load と validate では別々のオブジェクトが帰ってくるので
という感じでいけると思います。スマートポインタ使ってるコードですが。 _________________ // とっちゃん(高萩 俊行)@わんくま同盟 // とっちゃん’Blog // MS-MVP for Developer Tools - Visual C++ // WindowsInstallerの話題はhttp://www.freeml.com/msiまで | ||||
|
投稿日時: 2006-04-24 16:44
返信が遅くなってすみません。
MMXさま、らっこさま、とっちゃんさま アドバイスありがとうございました。 記載したコードにあるように、 load, add, putref_schemas, validate の順だと lineもsrcTextも取得できませんでした。 しかし、add, putref_schemas, load の順に変更したところ lineもsrcTextも取得できました。 DOMツリーを変更してからvalidateを行おうとすると lineは取得できないのですね。 とても勉強になりました。 本当にありがとうございました。 ぱんぷ |
1