我刚开始使用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" ) ) );
}
}
}
}你好,加菲尔德
发布于 2022-02-15 17:02:01
好的,经过大量的调试,我已经搞清楚了。基本上,下面对代码的更改现在允许我按预期设置变量:
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循环下面,以注册变量。
https://stackoverflow.com/questions/71086207
复制相似问题