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

📄 cxml.c

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

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

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

    GetPriorPath( pszPath, ( LPSTR )szPath );
    ASSERT_NORMAL( GetLastName( pszPath, ( LPSTR )szName ) );
    nPos = pXml->nTree.nRootPos;

    /*对XML_BASEGROW模式的处理*/
    if ( ( nMode & ( XML_BASEGROW ^ XML_AUTOGROW ) ) && !( nMode & XML_UNIQNAME ) ) {
        if ( strlen( szPath ) ) {
            /*节点的路径名不为空*/
            char szParentName[XML_NAME_LEN + 1];

            ASSERT_NORMAL( GetRootName( ( LPCSTR )szPath, ( LPSTR )szParentName ) );
            nPosLoc = nPos;
            /*定位节点名*/
            ASSERT_NORMAL( XML_Locate( pXml, &nPosLoc, ( LPCSTR )szParentName, XML_LOCLAST ) );

            if ( nPosLoc != NULL ) {
                /*判断此节点是否有子节点*/
                nPos = nPosLoc;
                if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) ) {
                    /*有子节点,则其父节点的最后增加一个同名的节点,并定位之*/
                    ASSERT_NORMAL( TREE_GetParent( ( PCTREESTRUCT )&( pXml->nTree ), &nPos ) );
                    ASSERT_NORMAL( XML_InsertChildTail( pXml, nPos, ( LPCSTR )szParentName, NULL, NULL ) );

                    /*定位刚添加的节点的位置*/
                    ASSERT_NORMAL( TREE_GetChildTail( ( PCTREESTRUCT )&( pXml->nTree ), &nPos ) );
                    DETECT_NULL( nPos );
                }

            }

        }

    }

    /*在XML中定位其父节点*/
    ASSERT_NORMAL( XML_Locate( pXml, &nPos, ( LPCSTR )szPath, nMode ) );

    DETECT_NULL( nPos );

    if ( nMode & XML_UNIQNAME ) {
        nPosLoc = nPos;
        if ( nMode & XML_LOCLAST ) {
            TREE_GetChildTail( ( PCTREESTRUCT )&( pXml->nTree ), &nPosLoc );
        }
        else {
            TREE_GetChildHead( ( PCTREESTRUCT )&( pXml->nTree ), &nPosLoc );
        }

        while ( nPosLoc != NULL ) {
            TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPosLoc, ( LPVOID * )&pNode );

            if ( strcmp( szName, pNode->szName ) == 0 ) {
                ASSERT_NORMAL( XML_SetInfoByPos( pXml, nPosLoc, szName, pszData ) );
                return NORMAL;

            }

            if ( nMode & XML_LOCLAST ) {
                TREE_GetPrior( ( PCTREESTRUCT )&( pXml->nTree ), &nPosLoc );
            }
            else {
                TREE_GetNext( ( PCTREESTRUCT )&( pXml->nTree ), &nPosLoc );
            }
        }
    }

    /*对XML_LEADGROW模块的处理*/
    if ( ( nMode & ( XML_LEADGROW ^ XML_AUTOGROW ) ) && !( nMode & XML_UNIQNAME ) && !( nMode & ( XML_BASEGROW ^ XML_AUTOGROW ) ) ) {
        /*尾节点自动增加的方式*/

        /*判断是否是根节点*/
        if ( nPos != pXml->nTree.nRootPos ) {
            /*定位最后一个同名节点*/
            nPosLoc = nPos;
            while( nPosLoc != NULL ) {
                nPos = nPosLoc;
                if ( XML_LocateNextTwin( ( PCXMLSTRUCT )pXml, &nPosLoc ) != NORMAL ) break;
            }

            /*判断此节点的子节点的个数,如果不是空节点或是父节点,则增加它*/
            if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) ) {
                /*首先在父节点的最后增加一个同级节点*/
                TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode );
                ASSERT_NORMAL( TREE_GetParent( ( PCTREESTRUCT )&( pXml->nTree ), &nPos ) );
                ASSERT_NORMAL( XML_InsertChildTail( pXml, nPos, ( LPCSTR )pNode->szName, NULL, NULL ) );
                ASSERT_NORMAL( TREE_GetChildTail( ( PCTREESTRUCT )&( pXml->nTree ), &nPos ) );
                DETECT_NULL( nPos );
            }
        }
    }

    ASSERT_NORMAL( XML_InsertChildTail( pXml, nPos, szName, pszData, pProp ) );

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_InsertChildHead( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData, IN PCNODEPROPERTY pProp )
{
    /*在子节点位置插入第一个子节点*/
    PXMLNODE pNode;
    UINT nDepth;
    UINT nNameLen, nDataLen, nLen, nProperLen, nLoop;
    char tmpName[XML_NAME_LEN + 1];

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

    /*取最后的节点名*/
    ASSERT_NORMAL( GetLastName( pszName, tmpName ) );

    /*应该考虑字符串长度为0的情况*/
    nNameLen = ( UINT )strlen( tmpName );
    nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 );

    DETECT( nNameLen <= XML_NAME_LEN );
    DETECT( nDataLen <= XML_DATA_LEN );

    TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode );

    /*如果加上此句,是正规XML的规范,但不符合XML的标准*/
    /*应该考虑到既有子节点,又有值的情况*/
    DETECT( pNode->pszData == NULL );

	/*计算属性的长度*/
	nProperLen = 0;
	if ( pProp != NULL ) {
		for( nLoop = 0; nLoop < pProp->nCount; nLoop ++ ) {
			nProperLen += ( UINT )( strlen( pProp->pVal[nLoop].szName ) + 2 \
				+ strlen( pProp->pVal[nLoop].szData ) \
                + Calu_Var_Chgs( pProp->pVal[nLoop].szData ) * 4 + 2 );
		}

	}
	
	/*计算XML的长度*/
    nDepth = TREE_GetDepth( ( PCTREESTRUCT )&( pXml->nTree ), nPos );
    nLen = pXml->nLen + nNameLen * 2 + 2 + nDataLen + nDepth + nProperLen;

    if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) == 0 )
        nLen += nDepth;

    DETECT( nLen <= pXml->nMaxLen );

    if ( VERIFY_NULL( pNode = XML_AllocNode( ( LPCSTR )tmpName, pszData, pProp ) ) &&
        VERIFY_NORMAL( TREE_InsertChildHead( &pXml->nTree, nPos, ( LPCVOID )pNode ) ) ) {
        pXml->nLen = nLen;
        return NORMAL;

    }

    if ( pNode != NULL )
        XML_FreeNode( pNode );

    return EXCEPTION;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_InsertChildTail( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData, IN PCNODEPROPERTY pProp )
{
    /*在子节点位置插入最后一个子节点*/
    PXMLNODE pNode;
    UINT nDepth;
    UINT nNameLen, nDataLen, nLen, nProperLen, nLoop;
    char tmpName[XML_NAME_LEN + 1];

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

    /*取最后的节点名*/
    ASSERT_NORMAL( GetLastName( pszName, tmpName ) );

    /*应该考虑字符串长度为0的情况*/
    nNameLen = ( UINT )strlen( tmpName );
    nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 );

    DETECT( nNameLen <= XML_NAME_LEN );
    DETECT( nDataLen <= XML_DATA_LEN );

    TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode );

    /*如果加上此句,是正规XML的规范,但不符合XML的标准*/
    /*应该考虑到既有子节点,又有值的情况*/
    DETECT( pNode->pszData == NULL );

	/*计算属性的长度*/
	nProperLen = 0;
	if ( pProp != NULL ) {
		for( nLoop = 0; nLoop < pProp->nCount; nLoop ++ ) {
			nProperLen += ( UINT )( strlen( pProp->pVal[nLoop].szName ) + 2 \
				+ strlen( pProp->pVal[nLoop].szData ) \
                + Calu_Var_Chgs( pProp->pVal[nLoop].szData ) * 4 + 2 );
		}
	}

	/*计算XML的长度*/
    nDepth = TREE_GetDepth( ( PCTREESTRUCT )&( pXml->nTree ), nPos );
    nLen = pXml->nLen + nNameLen * 2 + 2 + nDataLen + nDepth + nProperLen;

    /*因为缩进的关系,当成为父节点时,长度应该再加上一个节点的深度*/
    if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) == 0 )
        nLen += nDepth;

    DETECT( nLen <= pXml->nMaxLen );

    if ( VERIFY_NULL( pNode = XML_AllocNode( ( LPCSTR )tmpName, pszData, pProp ) ) &&
        VERIFY_NORMAL( TREE_InsertChildTail( &pXml->nTree, nPos, ( LPCVOID )pNode ) ) ) {
        pXml->nLen = nLen;
        return NORMAL;

    }

    if ( pNode != NULL )
        XML_FreeNode( pNode );

    return EXCEPTION;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_InsertPrior( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData, IN PCNODEPROPERTY pProp )
{
    /*在此节点前插入一个节点,pszName是不含路径的节点名*/
    PXMLNODE pNode;
    UINT nDepth;
    UINT nNameLen, nDataLen, nLen, nProperLen, nLoop;
    char tmpName[XML_NAME_LEN + 1];

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

    /*取最后的节点名*/
    ASSERT_NORMAL( GetLastName( pszName, tmpName ) );

    /*应该考虑字符串长度为0的情况*/
    nNameLen = ( UINT )strlen( tmpName );
    nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4);

    DETECT( nNameLen <= XML_NAME_LEN );
    DETECT( nDataLen <= XML_DATA_LEN );

	/*计算属性的长度*/
	nProperLen = 0;
	if ( pProp != NULL ) {
		for( nLoop = 0; nLoop < pProp->nCount; nLoop ++ ) {
			nProperLen += ( UINT )( strlen( pProp->pVal[nLoop].szName ) + 2 \
				+ strlen( pProp->pVal[nLoop].szData ) \
                + Calu_Var_Chgs( pProp->pVal[nLoop].szData ) * 4 + 2 );

		}

	}
	
	/*计算XML的长度*/
    nDepth = TREE_GetDepth( ( PCTREESTRUCT )&( pXml->nTree ), nPos );
    nLen = pXml->nLen + nNameLen * 2 + 1 + nDataLen + nDepth + nProperLen;

    DETECT( nLen <= pXml->nMaxLen );

    if ( VERIFY_NULL( pNode = XML_AllocNode( ( LPCSTR )tmpName, pszData, pProp ) ) &&
        VERIFY_NORMAL( TREE_InsertPrior( &pXml->nTree, nPos, ( LPCVOID )pNode ) ) ) {
        pXml->nLen = nLen;
        return NORMAL;

    }

    if ( pNode != NULL )
        XML_FreeNode( pNode );

    return EXCEPTION;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_InsertNext( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData, IN PCNODEPROPERTY pProp )
{
    /*在此节点后插入一个节点,pszName是不含路径的节点名*/
    PXMLNODE pNode;
    UINT nDepth;
    UINT nNameLen, nDataLen, nLen, nProperLen, nLoop;
    char tmpName[XML_NAME_LEN + 1];

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

    /*取最后的节点名*/
    ASSERT_NORMAL( GetLastName( pszName, tmpName ) );

    /*应该考虑字符串长度为0的情况*/
    nNameLen = ( UINT )strlen( tmpName );
    nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 );

    DETECT( nNameLen <= XML_NAME_LEN );
    DETECT( nDataLen <= XML_DATA_LEN );

	/*计算属性的长度*/
	nProperLen = 0;
	if ( pProp != NULL ) {
		for( nLoop = 0; nLoop < pProp->nCount; nLoop ++ ) {
			nProperLen += ( UINT )( strlen( pProp->pVal[nLoop].szName ) + 2 \
				+ strlen( pProp->pVal[nLoop].szData ) \
                + Calu_Var_Chgs( pProp->pVal[nLoop].szData ) * 4 + 2 );

		}

	}

	/*计算XML的长度*/
    nDepth = TREE_GetDepth( ( PCTREESTRUCT )&( pXml->nTree ), nPos );
    nLen = pXml->nLen + nNameLen * 2 + 1 + nDataLen + nDepth + nProperLen;

    DETECT( nLen <= pXml->nMaxLen );

    if ( VERIFY_NULL( pNode = XML_AllocNode( ( LPCSTR )tmpName, pszData, pProp ) ) &&
        VERIFY_NORMAL( TREE_InsertNext( &pXml->nTree, nPos, ( LPCVOID )pNode ) ) ) {
        pXml->nLen = nLen;
        return NORMAL;

    }

    if ( pNode != NULL )
        XML_FreeNode( pNode );

    return EXCEPTION;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_SetInfoByPos( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData )
{
    /*按位置置节点的值*/
    PXMLNODE pNode;
    LPSTR pszInsData = NULL;

    UINT nNameLen, nDataLen, nLen, nOrgNameLen, nOrgDataLen;
    char tmpName[33];

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

    /*取新节点名*/
    ASSERT_NORMAL( GetLastName( pszName, tmpName ) );

    nNameLen = ( UINT )strlen( tmpName );
    nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 );

    DETECT( nNameLen <= XML_NAME_LEN );
    DETECT( nDataLen <= XML_DATA_LEN );

    /*应该考虑到既有子节点,又有值的情况*/
    if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) > 0 )
        DETECT( pszData == NULL );

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

    nOrgNameLen = ( UINT )strlen( pNode->szName );
    nOrgDataLen = ( pNode->pszData == NULL ? 0 : ( UINT )strlen( pNode->pszData ) + Calu_Var_Chgs( ( LPCSTR )( pNode->pszData ) ) * 4 );

    nLen = pXml->nLen + 2 * nNameLen - 2 * nOrgNameLen +
           nDataLen - nOrgDataLen;

    DETECT( nLen <= pXml->nMaxLen );

    if ( ( pszData != NULL ) && ( strlen( pszData ) > 0 ) ) {
        if ( pNode->pszData != NULL && nOrgDataLen == nDataLen ) {
            pXml->nLen = nLen;

            strcpy( pNode->szName, tmpName );
            strcpy( pNode->pszData, pszData );
            return NORMAL;

        }
        else {
            ASSERT_NULL( pszInsData = ( LPSTR )AllocMemory( nDataLen + 2 ) );
            strcpy( pszInsData, pszData );

        }

    }

    if ( pNode->pszData != NULL )
        FreeMemory( pNode->pszData );

    pXml->nLen = nLen;

    pNode->pszData = pszInsData;
    strcpy( pNode->szName, tmpName );

    return NORMAL;

}

/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetInfoByPos( IN PCXMLSTRUCT pXml, IN POS nPos, OUT LPSTR pszName, IN UINT nNameSize, OUT LPSTR pszData, IN UINT nDataSize )
{
    /*取指定位置的节点信息*/
    PXMLNODE pNode;

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

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

⌨️ 快捷键说明

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