MSXML利用時,DTD関連のエラーでXMLが読めないときの対処

いや,ずっぽりはまった(笑

MSXMLを利用して,ORCA-CLAIMの電文XMLを読み込もうとしたら
IXMLDOMDocument.Load()が,エラー吐いて,読めやしない

原因をあれこれ追っかけていったら,
MSXMLのパーサが,構文解析エラーを起こしている模様


CLAIM電文(MML)中

    <!DOCTYPE Mml SYSTEM….

の行を,コメントアウトすると
引きあがるようにはなる

でも,コメントアウトしたXMLをCLAIMに投げつけても
たぶん,エラー起こして,データ受信してくれないようなぁ

ってことで,さらに追っかけたら,こちらに,似たような事例…

IXMLDOMDocument.resolveExternals
IXMLDOMDocument.validateOnParse

二つのプロパティ,FALSEにすれば,読み込むまでは可能になるとのこと

今回は,読み込んで,一部書き換えて,保存するって,作業なんで
これ,FALSEにしても,実害ないかな?

DELPHIで書き起こしてみました


//メンバとして定義
    FdomDocument   : IXMLDOMDocument;

//**********************************************
//コンストラクタ
//
//**********************************************
constructor TClaimOutput.Create;
begin
  inherited;

    FdomDocument       :=  CoDOMDocument.Create();      //インスタンス生成
    FdomDocument.async :=  true;    //同期モードがいいらしい

end;

//**********************************************
//XMLテンプレートの読み込み
//
//**********************************************
function TClaimOutput.Load : Boolean;
var
    wb : WordBool;
    a : Integer;
    l : Integer;
    st : string;
    st1 : string;
begin
    if (FileExists(FInPath + XML_INFILENAME) = false) then       //ファイルが見つからない場合
    begin
        Result := false;
        exit;
    end;

    FdomDocument.resolveExternals := false;     //二つのプロパティをFALSE
    FdomDocument.validateOnParse  := false;
    wb := FdomDocument.load(FInPath + XML_INFILENAME);   //CLAIM-XML読み込み

    if  ( wb = true) then  begin     //OK時
        result := true;
    end else begin            //NG時
        a  := FdomDocument.parseError.errorCode;
        l  := FdomDocument.parseError.line;
        st := FdomDocument.parseError.reason;
        st1 := FdomDocument.parseError.srcText;

        FErrorStr := IntToHex(a, 8) + ',' + IntToStr(l) + ',' + st + ',' + st1;
        //ShowMessage(FErrorStr);
        result := false;
    end;

end;

とりあえず,本番の送受信テストまでは
この実装で行きますです

やばかったら,そのとき,また悩む,ということで(笑


あと,MSXMLのバージョン表はこちらですわん
とりあえず,MSXML3にて作業は続けております

関連記事