3个回答
展开全部
我给你个解析的代码吧~具体存数据库得根据实际情况来
#include "StdAfx.h"
#include "parse.h"
#include <string>
#include "stdafx.h"
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <iostream>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
using namespace std;
parse::parse()
//int parse::parsexml()
{
xmlDocPtr doc; //定义解析文档指针
xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动)
xmlChar *szKey; //临时字符串变量
char *szDocName;
doc = xmlReadFile("SimACQ_Config.xml","GB2312",XML_PARSE_RECOVER); //解析文件
//检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。
if (NULL==doc)
{
fprintf(stderr,"Document not parsed successfully. /n");
/*return -1;*/
}
curNode = xmlDocGetRootElement(doc); //确定文档根元素
/*检查确认当前文档中包含内容*/
if (NULL == curNode)
{
fprintf(stderr,"empty document/n");
xmlFreeDoc(doc);
/*return -1;*/
}
/*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/
if (xmlStrcmp(curNode->name, BAD_CAST "SIMCONFIG"))
{
fprintf(stderr,"document of the wrong type, root node != mail");
xmlFreeDoc(doc);
/*return -1; */
}
curNode = curNode->xmlChildrenNode;
xmlNodePtr propNodePtr = curNode;
while(curNode != NULL)
{
//取出节点中的内容
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"ComConfig")))
{
xmlNodePtr comConfigPtr= curNode->children;
while(comConfigPtr!=NULL)
{
if((!xmlStrcmp(comConfigPtr->name,(const xmlChar *)"DMS")))
{
xmlChar* szAttr = xmlGetProp(comConfigPtr,BAD_CAST "IP");
IP=(char*)szAttr;
szAttr=xmlGetProp(comConfigPtr,BAD_CAST "PORT");
PORT=atoi((const char *)szAttr);
szAttr=xmlGetProp(comConfigPtr,BAD_CAST "TIMEOUT");
TIMEOUT=atoi((const char *)szAttr);
xmlFree(szAttr);
}
comConfigPtr=comConfigPtr->next;
}
}
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"Log")))
{
xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST "Flag");
if(szAttr!=NULL)
{
if((!xmlStrcmp(szAttr,(const xmlChar *)"True")))
{
FLAG=true;
}
else
{
FLAG=false;
}
}
szAttr = xmlGetProp(curNode,BAD_CAST "Path");
if(szAttr!=NULL)
{
PATH=(char*)szAttr;
}
xmlFree(szAttr);
}
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"DMS")))
{
xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST "Cache");
if(szAttr!=NULL)
{
Cache=atoi((const char *)szAttr);
}
xmlFree(szAttr);
}
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"SimFile")))
{
xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST "Type");
if(szAttr!=NULL)
{
if((!xmlStrcmp(szAttr,(const xmlChar *)"PlainFilm")))
{
xmlNodePtr FileNodes=curNode->children;
int i=0;
while(FileNodes!=NULL)
{
if((!xmlStrcmp(FileNodes->name,(const xmlChar *)"FILE")))
{
szAttr = xmlGetProp(FileNodes,BAD_CAST "name");
if(szAttr!=NULL)
{
/*SIM_PLAIN[i].Name=(char*)szAttr;*/
strcpy(simulation.SIM_PLAIN[i].Name,(char*)szAttr);
}
szAttr=xmlGetProp(FileNodes,BAD_CAST "sliceNum");
if(szAttr!=NULL)
{
simulation.SIM_PLAIN[i].Num=atoi((char*)szAttr);
}
i++;
}
FileNodes=FileNodes->next;
}
xmlFree(FileNodes);
simulation.SIM_PLAIN[i].flag=0;
}
if((!xmlStrcmp(szAttr,(const xmlChar *)"Spiral"))){
xmlNodePtr FileNodes=curNode->children;
int i=0;
while(FileNodes!=NULL)
{
if((!xmlStrcmp(FileNodes->name,(const xmlChar *)"FILE")))
{
szAttr = xmlGetProp(FileNodes,BAD_CAST "name");
if(szAttr!=NULL)
{
/*SIM_SPIRAL[i].Name=(char*)szAttr;*/
strcpy(simulation.SIM_SPIRAL[i].Name,(char*)szAttr);
}
szAttr=xmlGetProp(FileNodes,BAD_CAST "sliceNum");
if(szAttr!=NULL)
{
simulation.SIM_SPIRAL[i].Num=atoi((char*)szAttr);
}
i++;
}
FileNodes=FileNodes->next;
}
xmlFree(FileNodes);
simulation.SIM_SPIRAL[i].flag=0;
}
if((!xmlStrcmp(szAttr,(const xmlChar *)"axial")))
{
xmlNodePtr FileNodes=curNode->children;
int i=0;
while(FileNodes!=NULL)
{
if((!xmlStrcmp(FileNodes->name,(const xmlChar *)"FILE")))
{
szAttr = xmlGetProp(FileNodes,BAD_CAST "name");
if(szAttr!=NULL)
{
/* SIM_AXIAL[i].Name=(char*)szAttr;*/
strcpy(simulation.SIM_AXIAL[i].Name,(char*)szAttr);
}
szAttr=xmlGetProp(FileNodes,BAD_CAST "sliceNum");
if(szAttr!=NULL)
{
simulation.SIM_AXIAL[i].Num=atoi((char*)szAttr);
}
i++;
}
FileNodes=FileNodes->next;
}
xmlFree(FileNodes);
simulation.SIM_AXIAL[i].flag=0;
}
}
xmlFree(szAttr);
}
curNode = curNode->next;
}
xmlFreeDoc(doc);
/*return 0;*/
}
有什么不明白的再问吧!
#include "StdAfx.h"
#include "parse.h"
#include <string>
#include "stdafx.h"
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <iostream>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
using namespace std;
parse::parse()
//int parse::parsexml()
{
xmlDocPtr doc; //定义解析文档指针
xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动)
xmlChar *szKey; //临时字符串变量
char *szDocName;
doc = xmlReadFile("SimACQ_Config.xml","GB2312",XML_PARSE_RECOVER); //解析文件
//检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。
if (NULL==doc)
{
fprintf(stderr,"Document not parsed successfully. /n");
/*return -1;*/
}
curNode = xmlDocGetRootElement(doc); //确定文档根元素
/*检查确认当前文档中包含内容*/
if (NULL == curNode)
{
fprintf(stderr,"empty document/n");
xmlFreeDoc(doc);
/*return -1;*/
}
/*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/
if (xmlStrcmp(curNode->name, BAD_CAST "SIMCONFIG"))
{
fprintf(stderr,"document of the wrong type, root node != mail");
xmlFreeDoc(doc);
/*return -1; */
}
curNode = curNode->xmlChildrenNode;
xmlNodePtr propNodePtr = curNode;
while(curNode != NULL)
{
//取出节点中的内容
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"ComConfig")))
{
xmlNodePtr comConfigPtr= curNode->children;
while(comConfigPtr!=NULL)
{
if((!xmlStrcmp(comConfigPtr->name,(const xmlChar *)"DMS")))
{
xmlChar* szAttr = xmlGetProp(comConfigPtr,BAD_CAST "IP");
IP=(char*)szAttr;
szAttr=xmlGetProp(comConfigPtr,BAD_CAST "PORT");
PORT=atoi((const char *)szAttr);
szAttr=xmlGetProp(comConfigPtr,BAD_CAST "TIMEOUT");
TIMEOUT=atoi((const char *)szAttr);
xmlFree(szAttr);
}
comConfigPtr=comConfigPtr->next;
}
}
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"Log")))
{
xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST "Flag");
if(szAttr!=NULL)
{
if((!xmlStrcmp(szAttr,(const xmlChar *)"True")))
{
FLAG=true;
}
else
{
FLAG=false;
}
}
szAttr = xmlGetProp(curNode,BAD_CAST "Path");
if(szAttr!=NULL)
{
PATH=(char*)szAttr;
}
xmlFree(szAttr);
}
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"DMS")))
{
xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST "Cache");
if(szAttr!=NULL)
{
Cache=atoi((const char *)szAttr);
}
xmlFree(szAttr);
}
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"SimFile")))
{
xmlChar* szAttr = xmlGetProp(curNode,BAD_CAST "Type");
if(szAttr!=NULL)
{
if((!xmlStrcmp(szAttr,(const xmlChar *)"PlainFilm")))
{
xmlNodePtr FileNodes=curNode->children;
int i=0;
while(FileNodes!=NULL)
{
if((!xmlStrcmp(FileNodes->name,(const xmlChar *)"FILE")))
{
szAttr = xmlGetProp(FileNodes,BAD_CAST "name");
if(szAttr!=NULL)
{
/*SIM_PLAIN[i].Name=(char*)szAttr;*/
strcpy(simulation.SIM_PLAIN[i].Name,(char*)szAttr);
}
szAttr=xmlGetProp(FileNodes,BAD_CAST "sliceNum");
if(szAttr!=NULL)
{
simulation.SIM_PLAIN[i].Num=atoi((char*)szAttr);
}
i++;
}
FileNodes=FileNodes->next;
}
xmlFree(FileNodes);
simulation.SIM_PLAIN[i].flag=0;
}
if((!xmlStrcmp(szAttr,(const xmlChar *)"Spiral"))){
xmlNodePtr FileNodes=curNode->children;
int i=0;
while(FileNodes!=NULL)
{
if((!xmlStrcmp(FileNodes->name,(const xmlChar *)"FILE")))
{
szAttr = xmlGetProp(FileNodes,BAD_CAST "name");
if(szAttr!=NULL)
{
/*SIM_SPIRAL[i].Name=(char*)szAttr;*/
strcpy(simulation.SIM_SPIRAL[i].Name,(char*)szAttr);
}
szAttr=xmlGetProp(FileNodes,BAD_CAST "sliceNum");
if(szAttr!=NULL)
{
simulation.SIM_SPIRAL[i].Num=atoi((char*)szAttr);
}
i++;
}
FileNodes=FileNodes->next;
}
xmlFree(FileNodes);
simulation.SIM_SPIRAL[i].flag=0;
}
if((!xmlStrcmp(szAttr,(const xmlChar *)"axial")))
{
xmlNodePtr FileNodes=curNode->children;
int i=0;
while(FileNodes!=NULL)
{
if((!xmlStrcmp(FileNodes->name,(const xmlChar *)"FILE")))
{
szAttr = xmlGetProp(FileNodes,BAD_CAST "name");
if(szAttr!=NULL)
{
/* SIM_AXIAL[i].Name=(char*)szAttr;*/
strcpy(simulation.SIM_AXIAL[i].Name,(char*)szAttr);
}
szAttr=xmlGetProp(FileNodes,BAD_CAST "sliceNum");
if(szAttr!=NULL)
{
simulation.SIM_AXIAL[i].Num=atoi((char*)szAttr);
}
i++;
}
FileNodes=FileNodes->next;
}
xmlFree(FileNodes);
simulation.SIM_AXIAL[i].flag=0;
}
}
xmlFree(szAttr);
}
curNode = curNode->next;
}
xmlFreeDoc(doc);
/*return 0;*/
}
有什么不明白的再问吧!
展开全部
用C#没LS那么复杂
最简单的办法,不需要直接写解析代码,直接使用dataset去load这个xml文件,然后修改dataset中的表与列的名称以符合数据库,然后将dataset插入数据库就可以了
优点:方便快捷
缺点:不灵活、无法处理超大数据的XML
复杂点可以考虑使用DOM去解析XML,然后自己添加数据库的插入、更新代码
优点:灵活,也还算快
缺点:无法处理超大数据的XML
最复杂的办法就是用SAX去解析XML,然后添加数据库处理代码
优点:灵活、可以处理超大数据的XML,内存占用低
缺点:实现难度最大
最简单的办法,不需要直接写解析代码,直接使用dataset去load这个xml文件,然后修改dataset中的表与列的名称以符合数据库,然后将dataset插入数据库就可以了
优点:方便快捷
缺点:不灵活、无法处理超大数据的XML
复杂点可以考虑使用DOM去解析XML,然后自己添加数据库的插入、更新代码
优点:灵活,也还算快
缺点:无法处理超大数据的XML
最复杂的办法就是用SAX去解析XML,然后添加数据库处理代码
优点:灵活、可以处理超大数据的XML,内存占用低
缺点:实现难度最大
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不清楚.
用 "易语言"就很简单了.
我自己做了一这样的东西基本和你这个一样.
用 "易语言"就很简单了.
我自己做了一这样的东西基本和你这个一样.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询