/****************************************
author : wangxh
Date : 2010/4/20 10:22:16
*****************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#include "XML.h"
int XMLAttr_ModifyName(XMLAttr *outNode, char *inName, TRetMsg *outMsg)
{
if(outNode->mName != NULL)
{
free(outNode->mName);
}
outNode->mName = Strig_New(inName, outMsg);
if(TRetMsg_CatchException(*outMsg, __FUNCTION__, WANGXH_TRUE) != WANGXH_TRUE)
{
return WANGXH_FALSE;
}
return WANGXH_TRUE;
}
int XMLAttr_ModifyValue(XMLAttr *outNode, char *inValue, TRetMsg *outMsg)
{
if(outNode->mValue != NULL)
{
free(outNode->mValue);
}
outNode->mValue = Strig_New(inValue, outMsg);
if(TRetMsg_CatchException(*outMsg, __FUNCTION__, WANGXH_TRUE) != WANGXH_TRUE)
{
return WANGXH_FALSE;
}
return WANGXH_TRUE;
}
int XMLNODE_ModifyName(XMLNode *outNode, char *inName, TRetMsg *outMsg)
{
if(outNode->mName != NULL)
{
free(outNode->mName);
}
outNode->mName = Strig_New(inName, outMsg);
if(TRetMsg_CatchException(*outMsg, __FUNCTION__, WANGXH_TRUE) != WANGXH_TRUE)
{
return WANGXH_FALSE;
}
return WANGXH_TRUE;
}
int XMLNODE_ModifyValue(XMLNode *outNode, char *inValue, TRetMsg *outMsg)
{
if(outNode == NULL)
{
TRetMsg_ThrowException(outMsg, "000107", "XMLNODE_ModifyValue [outNode is NULL]");
return WANGXH_FALSE;
}
if(outNode->mValue != NULL)
{
free(outNode->mValue);
}
outNode->mValue = Strig_New(inValue, outMsg);
if(TRetMsg_CatchException(*outMsg, __FUNCTION__, WANGXH_TRUE) != WANGXH_TRUE)
{
return WANGXH_FALSE;
}
return WANGXH_TRUE;
}
XMLAttr* XMLAttr_New(char *inAttrName, char *inAttrValue, TRetMsg *outMsg)
{
XMLAttr *vNodePoint;
char *vName;
char *vValue;
vNodePoint = (XMLAttr*)malloc(sizeof(XMLAttr));
if(vNodePoint == NULL)
{
TRetMsg_ThrowException(outMsg, "000102", "XMLAttr_New Error!!");
return NULL;
}
vNodePoint->mName = NULL;
if(XMLAttr_ModifyName(vNodePoint, inAttrName, outMsg) != WANGXH_TRUE)
{
free(vNodePoint);
return NULL;
}
vNodePoint->mValue = NULL;
if(XMLAttr_ModifyValue(vNodePoint, inAttrValue, outMsg) != WANGXH_TRUE)
{
free(vNodePoint);
return NULL;
}
vNodePoint->mNext = NULL;
return vNodePoint;
}
XMLNode* XMLNode_New(char *inNodeName, char *inAttrValue, TRetMsg *outMsg)
{
XMLNode *vNodePoint;
char *vName;
vNodePoint = (XMLNode*)malloc(sizeof(XMLNode));
if(vNodePoint == NULL)
{
TRetMsg_ThrowException(outMsg, "000104", "XMLNode_New Error!!");
return NULL;
}
vNodePoint->mName = NULL;
if(XMLNODE_ModifyName(vNodePoint, inNodeName, outMsg) != 0)
{
free(vNodePoint);
return NULL;
}
vNodePoint->mValue = NULL;
if(XMLNODE_ModifyValue(vNodePoint, inAttrValue, outMsg) != 0)
{
free(vNodePoint);
return NULL;
}
vNodePoint->mAttriList = NULL;
vNodePoint->mParent = NULL;
vNodePoint->mChild = NULL;
vNodePoint->mNext = NULL;
return vNodePoint;
}
int XMLAttr_Free(XMLAttr *inHeadNode)
{
XMLAttr *tmpPoint;
tmpPoint = inHeadNode;
while(inHeadNode != NULL)
{
tmpPoint = inHeadNode;
inHeadNode = inHeadNode->mNext;
free(tmpPoint->mName);
free(tmpPoint->mValue);
free(tmpPoint);
}
return WANGXH_TRUE;
}
int XMLNode_Free(XMLNode *inHeadNode)
{
if(inHeadNode->mNext != NULL)
XMLNode_Free(inHeadNode->mNext);
if(inHeadNode->mChild != NULL)
XMLNode_Free(inHeadNode->mChild);
XMLAttr_Free(inHeadNode->mAttriList);
free(inHeadNode->mName);
inHeadNode->mName = NULL;
free(inHeadNode->mValue);
inHeadNode->mName = NULL;
free(inHeadNode);
inHeadNode = NULL;
return WANGXH_TRUE;
}
int XMLNode_AddNextNode(XMLNode *inHeadNode, XMLNode *inAddNode)
{
XMLNode *vNextNode;
vNextNode = inHeadNode;
while(vNextNode->mNext != NULL)
vNextNode = vNextNode->mNext;
vNextNode->mNext = inAddNode;
return WANGXH_TRUE;
}
int XMLNode_AddChildNode(XMLNode *inParentNode, XMLNode *inChildNode, TRetMsg *outMsg)
{
if(inParentNode == NULL)
{
TRetMsg_ThrowException(outMsg, "000105", "%s Error [inParentNode is NULL]", __FUNCTION__);
return WANGXH_FALSE;
}
if(inChildNode == NULL)
{
TRetMsg_ThrowException(outMsg, "000105", "%s Error [inChildNode is NULL]", __FUNCTION__);
return WANGXH_FALSE;
}
if(inParentNode->mChild == NULL)
inParentNode->mChild = inChildNode;
else
{
XMLNode_AddNextNode(inParentNode->mChild, inChildNode);
}
inChildNode->mParent = inParentNode;
return WANGXH_TRUE;
}
int XMLNode_AddXmlAttr(XMLNode *inNode, char *inName, char *inValue, TRetMsg *outMsg)
{
XMLAttr *vNewAttr, *tmpPoint;
vNewAttr = XMLAttr_New(inName, inValue, outMsg);
if(vNewAttr == NULL)
{
TRetMsg_ThrowException(outMsg, "000112", "XMLNode_AddXmlAttr error at XMLAttr_New");
return WANGXH_FALSE;
}
tmpPoint = inNode->mAttriList;
if(tmpPoint == NULL)
inNode->mAttriList = vNewAttr;
else
{
while(tmpPoint->mNext != NULL)
tmpPoint = tmpPoint->mNext;
tmpPoint->mNext = vNewAttr;
}
return WANGXH_TRUE;
}
int XMLAttr_PrintNode(XMLAttr inNode)
{
printf(" %s=\"%s\"", inNode.mName, inNode.mValue);
return WANGXH_TRUE;
}
int XMLAttr_PrintList(XMLAttr *inHeadNode)
{
XMLAttr *tmpPoint;
tmpPoint = inHeadNode;
while(tmpPoint != NULL)
{
XMLAttr_PrintNode(*tmpPoint);
tmpPoint = tmpPoint->mNext;
}
return WANGXH_TRUE;
}
int XMLNode_Print(XMLNode *inHeadNode, char *inDataStr)
{
char vDataStr[255] = {0}, tmpStr[100];
printf("\n%s<%s",inDataStr, inHeadNode->mName);
XMLAttr_PrintList(inHeadNode->mAttriList);
printf(">");
sprintf(vDataStr, "%s", inDataStr);
if(inHeadNode->mChild != NULL)
{
sprintf(tmpStr, "%s ", vDataStr);
XMLNode_Print(inHeadNode->mChild, tmpStr);
}
if(inHeadNode->mValue != NULL && inHeadNode->mValue[0] != 0)
printf("%s", inHeadNode->mValue);
if(inHeadNode->mChild == NULL)
printf("</%s>", inHeadNode->mName);
else
printf("\n%s</%s>", inDataStr, inHeadNode->mName);
if(inHeadNode->mNext != NULL)
{
XMLNode_Print(inHeadNode->mNext, vDataStr);
}
return WANGXH_TRUE;
}
XMLNode* XML_GetXmlTree(
XMLNode *inCurrentStageNode, char *inToken,
int currentStage, int *currentLevel, TRetMsg *outMsg)
{
static char destStr[255]={0}, tmpStr[255] = {0};
static preStage = 0;
static XMLAttr tmpAttr;
XMLNode *newNode, *tmpPoint;
int levelNum;
newNode = NULL;
levelNum = *currentLevel;
tmpPoint = inCurrentStageNode;
switch(currentStage)
{
case 11:/*旧标签名*/
if(strcmp(tmpPoint->mName, inToken) == 0)
{
if(tmpPoint->mParent != NULL)
tmpPoint = tmpPoint->mParent;
}
else
TRetMsg_ThrowException(outMsg, "000109", "XML_GetXmlTree:Error");
levelNum--;
break;
case 2: /*新标签名*/
if(preStage != currentStage)
{
newNode = XMLNode_New(inToken, "", outMsg);
if(tmpPoint != NULL)
XMLNode_AddChildNode(tmpPoint, newNode, outMsg);
levelNum++;
tmpPoint = newNode;
}
break;
case 3:/*标签属性名*/
tmpAttr.mName = Strig_New(inToken, outMsg);
break;
case 5:/*拼装标签属性 值*/
if(currentStage == preStage)
{
sprintf(destStr, "%s%s", tmpStr, inToken);
strcpy(tmpStr, destStr);
}
break;
case 6:/*标签属性 值 tmpStr*/
if(preStage != currentStage)
{
tmpAttr.mValue = Strig_New(tmpS
没有合适的资源?快使用搜索试试~ 我知道了~
C开发的XML简单解析器
共14个文件
c:4个
h:3个
o:3个
4星 · 超过85%的资源 需积分: 3 31 下载量 144 浏览量
2011-08-31
18:55:17
上传
评论
收藏 41KB ZIP 举报
温馨提示
在Linux下使用C语言开发的简单XML文件的解析器。未作XML特殊标识识别,只做到了XML标签的识别与匹配、字段与属性的扣取。
资源推荐
资源详情
资源评论
收起资源包目录
XML.zip (14个子文件)
XML
bin
test.xml 3KB
include
XML.h 2KB
Scaner.h 1KB
TRetMsg.h 714B
server
XML.o 28KB
makefile 2KB
Scaner.o 16KB
TRetMsg.o 6KB
Scaner.c 8KB
TRetMsg.c 2KB
XML.c 12KB
src
XMLPhrase.c 1KB
makefile 2KB
lib
libMyPlatform.a 53KB
共 14 条
- 1
资源评论
- wanzai06132013-07-10要是有注释就更好了,看看还行
- MillDragon2013-05-24代码基本没有注释,不易理解。
- haozi5962013-03-25可以解析,但是代码没注释只能硬看喽
- 五柳--先生2012-08-27makefile没有注释,编译了半天
saoqin
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功