⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cxml.c

📁 一个简单的在unix 处理xml解析的程序。程序流程简单功能清晰。对想自已写xml处理程序的应有一定的帮助
💻 C
📖 第 1 页 / 共 5 页
字号:

    DETECT( nNameSize > strlen( pNode->szName ) );
    strcpy( pszName, pNode->szName );

    if ( pNode->pszData == NULL ) {
        DETECT( nDataSize > 1 );
        strcpy( pszData, "" );

    }
    else {
        DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
        strcpy( pszData, pNode->pszData );

    }

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetNextInfo( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT LPSTR pszName, IN UINT nNameSize, OUT LPSTR pszData, IN UINT nDataSize )
{
    /*取指定节点的下一节点的信息*/
    DETECT_NULL( pXml );
    DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), *pPos ) );

    ASSERT_NORMAL( TREE_GetNext( ( PCTREESTRUCT )&( pXml->nTree ), pPos ) );
    DETECT_NULL( *pPos );

    return XML_GetInfoByPos( pXml, *pPos, pszName, nNameSize, pszData, nDataSize );

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_SetPropertyByPos( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN PCNODEPROPERTY pProp )
{
    /*置指定位置的节点的属性*/
	PXMLNODE pNode;
	UINT nOrgProperLen, nProperLen, iLoop;

	DETECT_NULL( pXml );
	DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );

    /*取节点信息*/
    ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );

	/*计算属性的长度*/
	nOrgProperLen = 0;
    for( iLoop = 0; iLoop < pNode->nProperty.nCount; iLoop ++ ) {
        nOrgProperLen += ( UINT )( strlen( pNode->nProperty.pVal[iLoop].szName ) + 2 \
            + strlen( pNode->nProperty.pVal[iLoop].szData ) \
            + Calu_Var_Chgs( pNode->nProperty.pVal[iLoop].szData ) * 4 + 2 );
	}

	nProperLen = 0;
	if ( pProp != NULL ) {
		for( iLoop = 0; iLoop < pProp->nCount; iLoop ++ ) {
			nProperLen += ( UINT )( strlen( pProp->pVal[iLoop].szName ) + 2 \
				+ strlen( pProp->pVal[iLoop].szData ) \
                + Calu_Var_Chgs( pProp->pVal[iLoop].szData ) * 4 + 2 );
		}
	}
	
	/*更新属性信息*/
    XML_FreeProperty( &( pNode->nProperty ) );
    /*修改长度信息*/
    pXml->nLen -= nOrgProperLen;

    if ( ( pProp != NULL ) && ( pProp->nCount ) ) {
        /*分配属性内存*/
        ASSERT_NORMAL( XML_AllocProperty( & pNode->nProperty, pProp->nCount ) );
        memcpy( pNode->nProperty.pVal, pProp->pVal, pProp->nCount * sizeof( PROPER ) );
        pXml->nLen += nProperLen;

	}

	return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetPropertyByPos( IN PCXMLSTRUCT pXml, IN POS nPos, OUT PNODEPROPERTY pProp )
{
    /*取指定位置的节点的属性*/
	PXMLNODE pNode;
	
	DETECT_NULL( pXml );
	DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
    DETECT_NULL( pProp );

    /*取节点信息*/
    ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );

    /*取属性的值*/
    XML_FreeProperty( pProp );

    /*分配节点属性的内存*/
    ASSERT_NORMAL( XML_AllocProperty( pProp, pNode->nProperty.nCount ) );
    memcpy( pProp->pVal, pNode->nProperty.pVal, pNode->nProperty.nCount * sizeof( PROPER ) );

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_SetVal( IN OUT PXMLSTRUCT pXml, IN LPCSTR pszPath, IN LPCSTR pszData )
{
    /*按指定的名字设置节点值*/
    PXMLNODE pNode;
    POS nPos;

    DETECT_NULL( pXml );
    DETECT_NULL( pXml->nTree.nRootPos );

    DETECT( pszData == NULL || ( strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 ) <= XML_DATA_LEN );

    DETECT_NULL( pszPath );
    DETECT( strlen( pszPath ) <= XML_PATH_LEN );

    nPos = pXml->nTree.nRootPos;
    /*诊断定位*/
    ASSERT_NORMAL( XML_Locate( pXml, &nPos, pszPath, 0 ) );
    DETECT_NULL( nPos );

    ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
    ASSERT_NORMAL( XML_SetInfoByPos( pXml, nPos, ( LPCSTR )( pNode->szName ), pszData ) );

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetVal( IN PCXMLSTRUCT pXml, IN LPCSTR pszPath, OUT LPSTR pszData, IN UINT nDataSize, OUT PPOS pPos )
{
    /*取指定的节点的名字,并可选择返回节点的位置*/
    PXMLNODE pNode;
    POS nPos;

    DETECT_NULL( pXml );
    DETECT_NULL( pXml->nTree.nRootPos );

    DETECT_NULL( pszPath );
    DETECT( strlen( pszPath ) <= XML_PATH_LEN );

    DETECT_NULL( pszData );
    
    nPos = pXml->nTree.nRootPos;
    ASSERT_NORMAL( XML_Locate( ( PXMLSTRUCT )pXml, &nPos, pszPath, 0 ) );

    if ( nPos != NULL ) {
        ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );

        if ( pPos != NULL ) *pPos = nPos;
        if ( pNode->pszData != NULL ) {
            DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
            strcpy( pszData, ( LPCSTR )( pNode->pszData ) );

            return NORMAL;

        }

    }

    DETECT( nDataSize >= 1 );
    strcpy( pszData, "" );

    return ( ( nPos != NULL ) ? NORMAL : INVALID );

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_SetProperty( IN OUT PXMLSTRUCT pXml, IN LPCSTR pszPath, IN PCNODEPROPERTY pProp )
{
    /*置指定节点名的节点的属性*/
    POS nPos;

    DETECT_NULL( pXml );
    DETECT_NULL( pXml->nTree.nRootPos );

    DETECT_NULL( pszPath );
    DETECT( strlen( pszPath ) <= XML_PATH_LEN );

    nPos = pXml->nTree.nRootPos;
    ASSERT_NORMAL( XML_Locate( pXml, &nPos, pszPath, 0 ) );
    DETECT_NULL( nPos );

    ASSERT_NORMAL( XML_SetPropertyByPos( pXml, nPos, pProp ) );

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetProperty( IN PCXMLSTRUCT pXml, IN LPCSTR pszPath, OUT PNODEPROPERTY pProp, OUT PPOS pPos )
{
    /*取指定节点名的节点的属性,并返回节点的位置*/
    POS nPos;

    DETECT_NULL( pXml );
    DETECT_NULL( pXml->nTree.nRootPos );

    DETECT_NULL( pszPath );
    DETECT( strlen( pszPath ) <= XML_PATH_LEN );
    
    nPos = pXml->nTree.nRootPos;
    ASSERT_NORMAL( XML_Locate( ( PXMLSTRUCT )pXml, &nPos, pszPath, 0 ) );

    DETECT_NULL( nPos );

    if ( pPos != NULL ) *pPos = nPos;
    ASSERT_NORMAL( XML_GetPropertyByPos( pXml, nPos, pProp ) );

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetNextVal( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT LPSTR pszData, IN UINT nDataSize )
{
    /*与XML_GetVal、XML_GetProperty函数配合使用,取下一个同名节点的值*/
    PXMLNODE pNode;

    DETECT_NULL( pPos );
    DETECT_NULL( *pPos );

    ASSERT_NORMAL( XML_LocateNextTwin( pXml, pPos ) );

    DETECT_NULL( *pPos );
    ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), *pPos, ( LPVOID * )&pNode ) );

    if ( pNode->pszData != NULL ) {
        DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
        strcpy( pszData, ( LPCSTR )( pNode->pszData ) );

    }
    else {
        DETECT( nDataSize >= 1 );
        strcpy( pszData, "" );

    }

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetNextProperty( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT PNODEPROPERTY pProp )
{
    /*与XML_GetVal、XML_GetProperty配合使用,取下一个同名节点的值*/
    DETECT_NULL( pPos );
    DETECT_NULL( *pPos );

    ASSERT_NORMAL( XML_LocateNextTwin( pXml, pPos ) );

    DETECT_NULL( *pPos );

    return XML_GetPropertyByPos( pXml, *pPos, pProp );

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetPriorVal( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT LPSTR pszData, IN UINT nDataSize )
{
    /*与XML_GetVal、XML_GetProperty函数配合使用,取上一个同名节点的值*/
    PXMLNODE pNode;

    DETECT_NULL( pPos );
    DETECT_NULL( *pPos );

    ASSERT_NORMAL( XML_LocatePriorTwin( pXml, pPos ) );

    DETECT_NULL( *pPos );
    ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), *pPos, ( LPVOID * )&pNode ) );

    if ( pNode->pszData != NULL ) {
        DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
        strcpy( pszData, ( LPCSTR )( pNode->pszData ) );
    }
    else {
        DETECT( nDataSize >= 1 );
        strcpy( pszData, "" );
    }

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetPriorProperty( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT PNODEPROPERTY pProp )
{
    /*与XML_GetVal、XML_GetProperty配合使用,取上一个同名节点的值*/
    DETECT_NULL( pPos );
    DETECT_NULL( *pPos );

    ASSERT_NORMAL( XML_LocatePriorTwin( pXml, pPos ) );

    DETECT_NULL( *pPos );

    return XML_GetPropertyByPos( pXml, *pPos, pProp );

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetNodePath( IN PCXMLSTRUCT pXml, IN POS nPos, OUT LPSTR pszPath, IN OUT UINT *pnLen )
{
    /*取节点的路径或路径的长度
    如果:pszPath为空,则返回路径的长度
    2003-05-19新增加的函数

    此函数应该修改
    */
    char sztmpBuffer[XML_MAX_PATH + 1];
    char sztmpPath[XML_MAX_PATH + 1];
    POS nParent;
    PXMLNODE pNode;
    UINT nLen;

    DETECT_NULL( pXml );
    DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );

    memset( sztmpBuffer, 0, sizeof( sztmpBuffer ) );
    memset( sztmpPath, 0, sizeof( sztmpPath ) );

    nParent = nPos;
    ASSERT_NORMAL( TREE_GetParent( ( PCTREESTRUCT )&( pXml->nTree ), &nParent ) );

    if ( nParent != NULL ) {
        ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
        strcat( sztmpPath, pNode->szName );

    }
    else {
        return INVALID;

    }

    while( nParent != NULL ) {
        /*取父节点*/
        nPos = nParent;
        ASSERT_NORMAL( TREE_GetParent( ( PCTREESTRUCT )&( pXml->nTree ), &nParent ) );
        if ( nParent == NULL ) break;

        ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
        strcpy( sztmpBuffer, pNode->szName );
        strcat( sztmpBuffer, "/" );
        strcat( sztmpBuffer, sztmpPath );
        strcpy( sztmpPath, sztmpBuffer );
        memset( sztmpBuffer, 0, sizeof( sztmpBuffer ) );

    }

    nLen = ( UINT )strlen( sztmpPath );

    if ( pszPath != NULL ) {
        /*取值及取长度*/
        if ( nLen >= *pnLen ) {
            *pszPath = 0;
            *pnLen = nLen;
            return INVALID;

        }
        else {
            strcpy( pszPath, sztmpPath );
            *pnLen = nLen;

        }
    }
    else {
        /*只取长度*/
        *pnLen = nLen;

    }

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetSubVal( \
                     IN PCXMLSTRUCT pXml, \
                     IN POS nPos, \
                     IN LPCSTR pszPath, \
                     OUT LPSTR pszData, \
                     IN UINT nDataSize, \
                     OUT PPOS pSubPos \
                     )
{
    /*在节点中取其子节点的值,其中,pszPath指的是绝对路径*/
    PXMLNODE pNode;
    POS nSubPos;

    DETECT_NULL( pXml );
    DETECT_NULL( pXml->nTree.nRootPos );

    DETECT_NULL( pszPath );
    DETECT( strlen( pszPath ) <= XML_PATH_LEN );

    DETECT_NULL( pszData );

    ASSERT_NORMAL( XML_LocateSubNode( pXml, nPos, pszPath, XML_LOCFIRST, &nSubPos ) );

    if ( nSubPos != NULL ) {
        ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nSubPos, ( LPVOID * )&pNode ) );

        if ( pSubPos != NULL ) *pSubPos = nSubPos;
        if ( pNode->pszData != NULL ) {
            DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
            strcpy( pszData, ( LPCSTR )( pNode->pszData ) );

            return NORMAL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -