从IXMLDOMDocument :: transformNode函数获取运行时错误信息

时间:2011-08-19 16:06:58

标签: c++ error-handling xslt ixmldomdocument

我正在使用IXMLDOMDocument::transformNode使用看起来有点像这样的C ++代码来应用XSLT转换:

CComPtr<IXMLDOMDocument2> spXMLDoc;
// load spXMLDoc

CComPtr<IXMLDOMDocument2> spXSLDoc;
// load spXSLDoc

BSTR *pResult;
HRESULT hr = spXMLDoc->transformNode( spXSLDoc, pResult );
if (FAILED(hr))
{
    // Handle me
}

此代码正常工作,但是如果转换失败,那么我不知道如何获取有关失败的地点或原因的任何信息 - 此时它失败了(在具有多个包含的复杂XSLT上) )HRESULT为E_FAIL - 我有什么办法可以更详细地说明它失败的原因吗?

我已经尝试了parseError属性来获取更多错误详情:

IXMLDOMParseError *parseError = NULL;
hr = spXMLDoc->get_parseError(&parseError);
if ( !FAILED( hr ) )
{
    long errorCode = 0;
    hr = parseError->get_errorCode(&errorCode);
    // etc...

get_parseError的调用成功,但对get_errorCode的调用因HRESULT S_FALSE失败,表明没有解析错误。 This page告诉我有两种类型的错误 - 解析错误和运行时错误。它显示了如何处理两者,但似乎是面向JavaScript的 - 在我的例子中没有抛出C ++运行时错误。

1 个答案:

答案 0 :(得分:-1)

抱歉,我不确定C ++。您可以尝试快速命令行转换以帮助在XSLT中找到错误。 XSL将加载但存在许多错误,但无法转换。例如,弹出XSL文件中的某个位置以触发此类错误。

这是一个示例命令行转换工具。写入transform.js并从命令行运行cscript.exe transform.js

var strDOMObject = "MSXML2.FreeThreadedDOMDocument";
var strHTTPObject = "MSXML2.XMLHTTP";
var strTemplateObject = "MSXML2.XSLTemplate";

function transform( xml, xsl ) {
    var xslt = new ActiveXObject( strTemplateObject );
    var xmlReturn = new ActiveXObject( strDOMObject );
    var xslProc;
    try {
        xslt.stylesheet = xsl;
    } catch( e ) {
        throw e;
    }

    xslProc = xslt.createProcessor();
    xslProc.input = xml;
    xslProc.transform();
    return xslProc.output;
}


try {
    var xml = new ActiveXObject( strDOMObject );
    xml.load( "id.xml" );
    var xsl = new ActiveXObject( strDOMObject );
    xsl.load( "id.xsl" );
    WScript.Echo( transform( xml, xsl ) );

} catch( err ) {
    WScript.Echo (err.description );
}

希望这会有所帮助,并且您可以找到C ++答案。