`
hereson
  • 浏览: 1428668 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

基于TinyXML的XML文档操作(部分测试代码)

阅读更多

#include <stdio.h>
#include "tinyxml.h"
#include "tinystr.h"
//#pragma warning (disable : 4996)


/*==============全局数据===============*/
const char *substr = "■■";
enum OBJTYPE{ON_CHOSE =4,ON_JUDGE =2};
enum StdAns{A = 1,B,C,D};

/*==============定义结构体=============*/
typedef struct _ObjCollect{       //大题题干结构体
char tgs_Text[50][200];
char tgs_Ans[50][5];
int tgs_num;
OBJTYPE _Type;
void ClearText();//清空两数组
}*pObjCollect,ObjCollect;

typedef struct _ObjInfo{       //小题题干拆分结构体
char tg_Chose[5][50];
char *str_Ans;
char *str_u_Ans;
StdAns _stdAns;
OBJTYPE _Type;
}*pObjInfo,ObjInfo;

typedef struct _ObjRelation{
ObjCollect Rlx_Obj;
TiXmlElement *pRlx_Elm; 
}*pObjRelation,ObjRelation;

/*==============相关函数===============*/
OBJTYPE GetOpType();
ObjInfo TransText(const char * temp);
ObjCollect GetAllText(TiXmlElement *pElmCollect);
char *CpsTgtext();
void PrintA(ObjInfo objInfo);
void PrintAll(ObjCollect temp_obj);
void PrintAllWithStdAnswer(ObjCollect temp_obj);
ObjRelation DelNode(ObjRelation temp_rlx);
ObjRelation InsertNode(ObjRelation temp_rlx);
ObjRelation ModifyNode(ObjRelation temp_rlx);
//TiXmlElement SearchElm(TiXmlElement *pObjCollect, ObjCollect tgCollect);

/*==============主函数==================*/
int main()
{
TiXmlDocument *f_xml = NULL;
f_xml->LoadFile(".\\exam.xml");
f_xml->Print();

TiXmlElement *elmRoot = f_xml->RootElement();      //定义根结点
TiXmlElement *elmChos = elmRoot->FirstChildElement();//定义选择题结点
//TiXmlElement *elmtemp = elmChos->FirstChildElement();
//TiXmlElement *elmchild = elmtemp->FirstChildElement();
//TiXmlText abc("oop");
//elmchild->Clear();
//elmchild->InsertEndChild(abc);
//elmChos->InsertEndChild(*elmtemp);
f_xml->SaveFile();

return 0;
}

ObjInfo TransText(const char * temp)
{
ObjInfo sText;

int i = 0;
const char *p = NULL; 
const char *_p = NULL;
size_t strlength;
p = temp;
memset(sText.tg_Chose,'\0',sizeof(sText.tg_Chose));

p = strstr(temp,substr);        //获得主题干
if(p)
{
     strlength = strlen(temp) - strlen(p);
     strncpy_s(sText.tg_Chose[i],temp,strlength);
}
else
{
     return sText;
}
i++;

for(; i<5;)            //获得各选项
{
     p += 4;
     size_t tempLen = strlen(p);
     _p = strstr(p,substr);
     if(!_p)
     {
      strncpy_s(sText.tg_Chose[i],p,strlength);
      break;
     }
     strlength = tempLen - strlen(_p);
     strncpy_s(sText.tg_Chose[i],p,strlength);
     p = _p;
     i++;
}
//for(; i>=0; i--)
//{
// printf("%s\n",tg_Temp[i]);
//}
return sText;
}

ObjCollect GetAllText(TiXmlElement *pElmCollect)
{
ObjCollect tgStext;
tgStext.tgs_num = 0;

for(TiXmlElement *pElm = pElmCollect->FirstChildElement(); pElm; pElm = pElm->NextSiblingElement())
{
     TiXmlElement *pTemp = pElm->FirstChildElement();//定义题干结点
     TiXmlElement *pAns = pTemp->NextSiblingElement();//定义答案结点
     strcpy_s(tgStext.tgs_Text[tgStext.tgs_num],strlen(pTemp->GetText())+1,pTemp->GetText());
     strcpy_s(tgStext.tgs_Ans[tgStext.tgs_num],strlen(pAns->GetText())+1,pAns->GetText());
     tgStext.tgs_num++;
}
return tgStext;
}

char *CpsTgtext()
{
int i;
char *sText = "";
size_t str_size;
ObjInfo sNewText;
sNewText._Type = GetOpType();
printf("\nplease input new object by order:\nNow,please input main tg:");
scanf_s("%s",sNewText.tg_Chose[0]);

for(i = 0; i<sNewText._Type; i++)
{
     printf("\ninput the %d ans:",i+1);
     scanf_s("%s",sNewText.tg_Chose[i+1]);
}
strcat_s(sText,strlen(sText),sNewText.tg_Chose[0]);
str_size = strlen(substr);
for(i = 0; i<sNewText._Type; i++)
{
     char *sub_str = "■■";
     strcat_s(sub_str,str_size,sNewText.tg_Chose[i+1]);
     strcat_s(sText,strlen(sText),sub_str);
}
return sText;
}

OBJTYPE GetOpType()
{
int i = 0;
printf("please choose the op type:[1] 操作选择题/ [2] 操作判断题\n");
scanf_s("%d",&i);
if(1 == i)
{
     return ON_CHOSE;
}
else if(2 == i)
{
     return ON_JUDGE;
}
else
     return OBJTYPE(NULL);
}

void PrintAll(ObjCollect temp_obj)
{
int itemp = 0;
for(; itemp<temp_obj.tgs_num; itemp++)
{
     printf("%d.%s\n",itemp+1,temp_obj.tgs_Text[itemp]);
}
return;
}

ObjRelation DelNode(ObjRelation temp_rlx)
{
int iDelNum;
ObjCollect Rlx_Obj = temp_rlx.Rlx_Obj;
TiXmlElement *pRlx_Elm = temp_rlx.pRlx_Elm;
TiXmlElement *pDelElm = pRlx_Elm->FirstChildElement();
PrintAll(temp_rlx.Rlx_Obj);
printf("\nplease select the NO. of the OBJ which you want to del:");
while(true)
{
     scanf_s("%d",&iDelNum);
     if(iDelNum>temp_rlx.Rlx_Obj.tgs_num || iDelNum<1)
     {
      printf("wrong select!\n");
      continue;
     }
     else
     {
      for(; iDelNum>1; iDelNum--)
      {
       pDelElm = pDelElm->NextSiblingElement();
      }
      pRlx_Elm->RemoveChild(pDelElm);
      break;
     }
}
temp_rlx.Rlx_Obj.ClearText();
temp_rlx.Rlx_Obj = GetAllText(pRlx_Elm);
temp_rlx.pRlx_Elm = pRlx_Elm;
return temp_rlx;
}

void ObjCollect::ClearText()
{ 
memset(this->tgs_Text,'\0',sizeof(this->tgs_Text));
memset(this->tgs_Ans,'\0',sizeof(this->tgs_Ans));
return;
}

ObjRelation InsertNode(ObjRelation temp_rlx)
{
char *pAns = NULL;
TiXmlText Tg_Text(CpsTgtext());
printf("please input the currect answer:");
scanf_s("%s",pAns);
TiXmlText Ans_Text(pAns);
TiXmlElement *phNode = temp_rlx.pRlx_Elm;
TiXmlElement Obj_Elm("Q");
TiXmlElement Tg_Elm("TG");
TiXmlElement Ans_Elm("ANS");
TiXmlElement UAns_Elm("U_ANS");

Tg_Elm.InsertEndChild(Tg_Text);
Ans_Elm.InsertEndChild(Ans_Text);
Obj_Elm.InsertEndChild(Tg_Elm);
Obj_Elm.InsertEndChild(Ans_Elm);
Obj_Elm.InsertEndChild(UAns_Elm);

phNode->InsertEndChild(Obj_Elm);
temp_rlx.Rlx_Obj.ClearText();
temp_rlx.Rlx_Obj = GetAllText(phNode);
temp_rlx.pRlx_Elm = phNode;

return temp_rlx;
}

void PrintA(ObjInfo objInfo)
{
int itemp = 0;
char c = 65;
printf("%s\n",objInfo.tg_Chose[0]);
for(; itemp<objInfo._Type; itemp++)
{
     printf("%c.%s\n",c,objInfo.tg_Chose[itemp+1]);
     c++;
}
return;
}

void PrintAllWithStdAnswer(ObjCollect temp_obj)
{
int itemp = 0;
for(; itemp<temp_obj.tgs_num; itemp++)
{
     printf("%d.%s=====%s\n",itemp+1,temp_obj.tgs_Text[itemp],temp_obj.tgs_Ans[itemp]);
}
return;
}

ObjRelation ModifyNode(ObjRelation temp_rlx)
{
int itype = 0;
int inode = 0;
bool sign = false;
TiXmlElement *childElm = NULL;
TiXmlElement *tempElm = temp_rlx.pRlx_Elm;
PrintAllWithStdAnswer(temp_rlx.Rlx_Obj);
printf("please select the object you wish to modify:");
scanf_s("%d",&itype);
for(childElm = tempElm->FirstChildElement(); --itype>1;)
{
     tempElm = tempElm->NextSiblingElement();
}
TiXmlElement *pChild = tempElm->FirstChildElement();
while(true)
{
     printf("<1>All title ,<2>Std answer ,<3>Exit modify\nplease select which you wish to modify:");
     scanf_s("%d",&inode);
     if(inode == 1)
     {
      TiXmlText tText(CpsTgtext());
      pChild->Clear();
      pChild->InsertEndChild(tText);
      sign = true;
     }
     else if(inode == 2)
     {
      char *sAns = NULL;
      printf("please input the new std answer:");
      scanf_s("%s",sAns);
      TiXmlText oText(sAns);
      pChild->Clear();
      pChild->InsertEndChild(oText);
      sign = true;
     }
     else if(inode == 3)
     {
      return temp_rlx;
     }
     else
     {
      printf("wrong select!\n");
      continue;
     }
     if(true == sign)
      break;
}
temp_rlx.Rlx_Obj.ClearText();
temp_rlx.Rlx_Obj = GetAllText(tempElm);
temp_rlx.pRlx_Elm = tempElm;
return temp_rlx;
}

=============================================================

许多书写不规范,还有部分语法有误,Mark一个。。

分享到:
评论

相关推荐

    基于tinyxml2的xml操作库再封装

    对tinyxml2再封装,使使用更加便捷,方便。*******************************

    TinyXML2.5.2中文文档

    TinyXML2.5.2中文文档,中文文档更好的理解

    TinyXml接口文档

    TinyXml接口文档.docx TinyXml接口文档.docxTinyXml接口文档.docxTinyXml接口文档.docxTinyXml接口文档.docx

    tinyxml与tinyxml2

    tinyxml与tinyxml2两个版本的源码,操作xml很方便,解压可以直接使用.

    TinyXML指南[中文].pdf

    TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。

    tinyxml帮助文档

    tinyxml帮助文档 TinyXML is a simple, small, C++ XML parser that can be easily integrated into other programs.

    C/C++使用tinyxml读写XML文档

    个人感觉和java的xml解析类很相似,内附样例程序,不过最好还是到网上搜搜其他人的例子(PS:如果你不想看源码的话),网上发部的例子都是new了xmldocumen对象,(添加的元素节点都是以new的方式)却没有释放,这个...

    tinyxml_2_6_2,C++处理xml文件的库(含官方文档)

    └─tinyxml_2_6_2 │ changes.txt │ docs.rar │ readme.txt │ ├─include │ tinystr.cpp │ tinystr.h │ tinyxml.cpp │ tinyxml.h │ tinyxmlerror.cpp │ tinyxmlparser.cpp │ └─lib ├─...

    Tinyxml 源代码(VC6 & VS2005)

    输出数据直接写到FILE对象中,所以TinyXML代码没有内存负担。 被Print()和SaveFile()调用。 operator输出到一个c++流中。 与C++ iostreams集成在一起。 在"network printing"模式下输出没有换行符,这对于网络传输...

    TinyXML2 官方文档.rar

    TinyXML2(C++) 库的官方文档 TinyXML is a simple, small, C++ XML parser that can be easily integrated into other programs.

    TinyXML2 代码

    TinyXML2 代码

    基于TinyXml库的XML读写demo(linux和window VS2010版)

    本资源是基于TinyXml库的XML读写(linux和window VS2010版)的两个demo版本。包含linux的makefile,window VS2010的工程。包含TinyXml库文件,可直接用于项目开发。

    TinyXML代码用例

    TinyXML源码库和具体的生成xml,读取xml, 打印xml ,TinyXML嵌入到代码中的实例

    让开源项目TinyXml支持Unicode(wchar_t)

    开源项目TinyXml项目所涉及的字符编码说明如下: 1. TinyXml函数调用接口的字符型参数,仅支持`窄字符`格式(char*),不兼容`宽字符`格式(wchar_t*)。 2. TinyXml函数提供的Xml内容解析功能,仅支持以ANSI编码和UTF...

    tinyxml+tinyxpath+tinyxml++最新套件(20080916)

    tinyxml 2.5.3 + chm 文档 tinyxpath 1.3.1 tinyxml++

    tinyXML测试例子

    使用tinyXML的入门例程

    使用tinyxml 读写xml文件方法

    tinyxml 读写xml方法,简单易用!

    TinyXML_v2.5.3(支持C/C++的轻量级XML文档解析器)(含解析器源码和文档)

    一款轻量级的XML解析器,能够容易的解决中文问题 如果你要做的东西不是非常大的项目的话,比较...rar压缩包中包含了TinyXML解析器配套的文档,支持C、c++的轻量级的XML文档解析器,支持中文,非常适合不太大的项目

    tinyxml开源代码+测试用例+入门讲解

    tinyxml入门讲解+开源代码+应用实例 学习XML解析的好东西,入门级

    对tinyxml库封装

    描述: 对tinyxml库封装的简单类: 1,创建、保存xml ... 背景: tinyxml对xml操作的接口过于分散,为了适应自己的需要,对常用的接口进行简单的封 装,各个接口增加注释,方便使用。 环境: WinXP+VC6

Global site tag (gtag.js) - Google Analytics