Libxml2的使用——总新手

Libxml2 usage -- total novice

我是 libxml2 的新手,事实上这是我第一次使用。我一直在寻找一些可以为我指明正确方向的示例代码,但到目前为止我绝对没有成功。我正在尝试使用以下 XPath 语句:

"$XTX//DeptName[.=$Dn]"

但是,我不知道如何使用变量($XTX 和 $Dn)生成和评估查询。我不知道如何将变量替换添加到代码中。我假设我将需要 xmlXPathRegisterVariable API 但正如我所说,我根本不知道该怎么做。任何人都可以向我提供或指出一些我可以用来使它正常工作的示例代码吗?

        if ( 0 != iXmlArrDim ) { 
        Assert( XMLOID == ARR_ELEMENTS( pXmlDataArr ) );

        deconstruct_array( pXmlDataArr,
                           XMLOID,
                           -1, 
                           false,
                           'i',
                           &pXmlData,
                           &pXmlDataNulls,
                           (int32_t*)&iXmlCount );

        /** 
         */
        xmltype  *pX    = NULL;
        char     *pData = "<\>";
        uint32_t  iData = sizeof( "<\>" ) - 1;

        if ( !pXmlDataNulls[0] ) { 
            pX    = DatumGetXmlP( pXmlData[0] );
            pData = VARDATA( pX );
            iData = VARSIZE( pX ) - VARHDRSZ;

            pDoc = xmlCtxtReadMemory( pCtx, pData, iData, NULL, NULL, 0 );

            if ( NULL == pDoc )
                ereport( ERROR,
                         ( errcode( ERRCODE_INVALID_XML_DOCUMENT ),
                           errmsg( "Could not parse the XML document" ) ) );

            pXPathCtx = xmlXPathNewContext( pDoc );

            if ( NULL == pXPathCtx )
                ereport( ERROR,
                         ( errcode( ERRCODE_OUT_OF_MEMORY ),
                           errmsg( "Could not allocate XPath context" ) ) );

            pXPathCtx->node = (xmlNodePtr)pDoc;

            pXPathObj = xmlXPathEval( pXPathStr, pXPathCtx );
            //pXPathObj = xmlXPathEvalExpression( pXPathStr, pXPathCtx );

            /** 
             * Add any additional XML items or variables.
             */
            for ( size_t ix = 1; ix < ( iXmlCount >> 1 ); ++ix ) { 
                int                rc        = 0;
                xmlXPathObjectPtr  pXPathObj = NULL;
                const char        *pAlias    = NULL;

                pX    = DatumGetXmlP( pXmlData[ix * 2] );
                pData = VARDATA( pX );
                iData = VARSIZE( pX ) - VARHDRSZ;

                /** 
                 * Add the alias as a variable if one was specified.
                 */
                if ( !pXmlDataNulls[( ix * 2 ) + 1] ) { 
                    pAlias = TextDatumGetCString( pXmlData[ix * 2] );

                    rc = xmlXPathRegisterVariable( pXPathCtx,
                                                   BAD_CAST pAlias,
                                                   xmlXPathObjectCopy( pXPathObj ) );

                    if ( rc == -1 )
                        ereport( WARNING,
                                 ( errcode( ERRCODE_INTERNAL_ERROR ),
                                 errmsg( "Could not create an XPath object" ) ) );
                }   
            }   
        }   
    }

此致, 加菲猫

好的,经过大量调试我已经弄明白了。基本上,我的代码的以下更改现在允许我按预期设置变量:

                    pAlias = TextDatumGetCString( pXmlData[( ix * 2 ) + 1] );
                    pValue = xmlXPathNewString( BAD_CAST pData );
                    rc     = xmlXPathRegisterVariable( pXPathCtx,
                                                       BAD_CAST pAlias,
                                                       pValue );

                    if ( rc == -1 )
                        ereport( WARNING,
                                 ( errcode( ERRCODE_INTERNAL_ERROR ),
                                   errmsg( "Could not create an XPath object" ) ) );

随后,xmlXPathEval 被移动到 for 循环下方以注册变量。