首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libxml2使用-新手总数

Libxml2使用-新手总数
EN

Stack Overflow用户
提问于 2022-02-11 20:29:22
回答 1查看 44关注 0票数 0

我刚开始使用libxml2,实际上这将是我第一次使用。我一直在寻找一些可以指出正确方向的示例代码,但到目前为止,我一直没有成功。我试图使用以下XPath语句:

"$XTX//DeptName .= $Dn "

但是,我不知道如何使用变量($XTX和$Dn)来生成和计算查询。我不知道如何将变量替换添加到代码中。我想我将需要xmlXPathRegisterVariable API,但正如我所说的,我根本不知道如何做到这一点。有人能提供给我或者指给我一些样例代码,我可以用它来完成这个工作吗?

代码语言:javascript
复制
        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" ) ) );
                }   
            }   
        }   
    }

你好,加菲尔德

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-15 17:02:01

好的,经过大量的调试,我已经搞清楚了。基本上,下面对代码的更改现在允许我按预期设置变量:

代码语言:javascript
复制
                    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循环下面,以注册变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71086207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档