网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C/C++ > 正文
用c读取XML文件
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

可以将XML文件的树(只有一个顶层节点).于是理所当然的可以用树作为XML的一种存储结构.
我将在这里用C++实现对简单的XML文件的解析.
1.选择存储结构:
树型数据结构有多种存储方式,我将用"孩子兄弟表示法",定义如下:
typedef struct CSNode
{
int subNodes;
string data;
string name;
struct CSNode *firstChild,*nextsibling,*parent;
CSNode* operator=(CSNode cnode)
{
this->data = cnode.data;
this->firstChild = cnode.firstChild;
this->name = cnode.name;
this->nextsibling = cnode.nextsibling;
this->subNodes = cnode.subNodes;
return this;
}
}CSNode,*CSTree;

2.定义一个ADT,提供操作的公共接口.取名为 xml

class xml
{
public:
xml();
xml(char *fileName);
~xml();
CSNode& CreateTree(); // 建立存储结构
bool findData(const char *nodepos); // 查找节点值
bool findData(const char *partent, const char *child,string *data); // 查找节点值
bool readfile_(); // 读取xml源文件
void allocate(); // 释放节点资源
private:
string _fileCope;
char* _filename;
CSNode *head;

};

3.具体实现

#include "stdafx.h"
#include "xmlCreate.h"
#include "wstack.h"
#include <algorithm>
using namespace std;
xml::xml()
{
}
xml::xml(char *fileName) : _filename(fileName)
{
head = new CSNode;
}
xml::~xml()
{
delete head;
}
CSNode& xml::CreateTree()
{
CSNode *p = new CSNode;
CSNode *q = new CSNode;
CSNode *s = new CSNode;
wstack<string> nameStack;
wstack<CSNode> nodeStack;
string tmpstr;
string name,tempname,rootName,headName;
int noods = 0;
bool subroot = true,next = false,poproot = false;
unsigned short int enoods = 0;
char ps;
for (size_t i = 0; i < _fileCope.size(); ++i){
ps = _fileCope[i];
if (_fileCope[i] == '' '' || _fileCope[i] == ''\n'' || _fileCope[i] == ''\t'' || _fileCope[i] == 0x09 || _fileCope[i] == 0x0d)continue;
if (_fileCope[i] == ''<'' && _fileCope[i+1] != ''/'') {
s = new CSNode;
s->subNodes = 0;
enoods = 0;
}
else if (_fileCope[i] == ''>'') {
enoods = 0;
s->name = tmpstr;
nameStack.push(tmpstr);
tmpstr = "";
noods++;
size_t pn = i+1;
char bug;
while (pn < _fileCope.size()) {
bug = _fileCope[pn];
if (_fileCope[pn] == '' '' || _fileCope[pn] == ''\n'' || _fileCope[pn] == ''\t'' || _fileCope[pn] == 0x09 || _fileCope[pn] == 0x0d)
{
pn++;
continue;
}
else break;
}

if (_fileCope[pn] == ''<'') {
subroot = true; // 向上解析
}

if(noods == 1){ // 保存根结点
head = s;
head->parent = NULL;
head->nextsibling = NULL;
p = head;
headName = head->name;
}
else if (subroot) { // 还没有解析到叶子结点
if (poproot) {
p->nextsibling = s;
p = p->nextsibling;
poproot = false;
}
else{
s->parent = p;
p->firstChild = s;
p = p->firstChild;
}
}
else if (!subroot) { // 解析到叶子结点(第2个)
s->parent = p;
p->nextsibling = s;
p->firstChild = NULL;
p = p->nextsibling;
}
}
else if (_fileCope[i] == ''<'' && _fileCope[i+1] == ''/'') {
enoods++;
//p->firstChild = NULL;
if (subroot && enoods < 2){
q = p->parent;
rootName = q->name;
subroot = false;
}
if(!subroot)q->subNodes++;
string tname = nameStack.pop();
i = i+tname.size()+2;
if (tmpstr.size() > 0) {
s->data = tmpstr;
tmpstr

  • 上一篇资讯: 经典c程序100例(1--10)
  • 下一篇资讯: 引用与指针的区别
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号