您的位置:首页 > 其它

简单的XML解析程序

2007-04-20 17:28 435 查看
/*
*标 题: 简单的XML解析程序
*作 者: xuwedo
*文章属性: 原创
*来 源: http://blog.csdn.net/xuwedo2003/
*链 接: http://blog.csdn.net/xuwedo2003/
* Copyright (c) 2007
* All rights reserved.
* 如有转载,请注明作者及本信息
* 文件名称: 简单的XML解析程序
* 文件标识: 简单的XML解析程序
* 摘 要: 用C++简单地解析XML文件。
* 开始时间: 2007-04-19
*
* 当前版本: 1.0
* 作 者: xuwedo2001@sohu.com
* 相关信息: 深度问题,没有时间解决了,如有哪位朋友解决了,给我发一份。
* 完成日期: 2007年4月20日
*/
正文:

// xml.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <ctype.h>
#include <string>
#include <functional>
#include <vector>
using namespace std;

struct Node
{
string szName;
int iDeep;
};
vector<Node> vNode;
void analyzeXML(string & xmlContent);
static const basic_string <char>::size_type npos = -1;
int gideep=0;

void formatXML(string & content){
//去掉xml文件中所有空白字符.
content.erase(remove_if(content.begin(),content.end(),ptr_fun(::isspace)),content.end());
//去掉xml头部注释
basic_string <char>::size_type indexCommentEnd=0;
indexCommentEnd= content.find_first_of("?");
while (indexCommentEnd != npos)
{
if( '>'==content[++indexCommentEnd])
{
content.erase(0,++indexCommentEnd);
}
indexCommentEnd = content.find_first_of("?",indexCommentEnd);
}

analyzeXML(content);
}
bool readFromFile(string & filename){
FILE * file=NULL;
if (fopen_s(&file,filename.c_str(),"r"))
{
cout<<"Read xml file failed.";
return false;
}
string content="";
const int COUNT = 1024;
char buf[COUNT];
buf[COUNT -1]='/0';
size_t iReadNum=0;
while(COUNT-1 == (iReadNum=fread(&buf[0],sizeof(char),COUNT-1,file)))
{
content +=buf;
}
buf[iReadNum]='/0';
content += buf;
//xml文件都已读入content中,下面分析格式化之。

formatXML(content);

return true;

}
string szEndLabHead="</";
void analyzeXML(string & xmlContent){

if ('<'==xmlContent[0])
{
size_t it= xmlContent.find_first_of('>');
string nodeName = xmlContent.substr(1,it-1);

Node node ={nodeName,gideep};
vNode.push_back(node);

//找到结尾标签
string szEndStr= szEndLabHead+nodeName+">";
size_t stIndex=xmlContent.find(szEndStr);
if (string::npos!=stIndex)
{
string szMid=xmlContent.substr(++it,stIndex-it); //取出两个标签间的内容
analyzeXML(szMid); //递归
}else{
cout<<"XML 文件中有错误,请仔细检查!!";
return;
}

//两个标签下面还有兄弟标签,则续继处理。
size_t stOutOfLab=stIndex+szEndStr.size();
if (stOutOfLab <xmlContent.size())
{
string szTemp=xmlContent.substr(stOutOfLab,stIndex-stOutOfLab);
analyzeXML(szTemp);
}
}else{
cout<<vNode.back().szName.c_str()<<"==>"<<xmlContent.c_str()<<endl;
vNode.pop_back();

}
}

int _tmain(int argc, TCHAR * argv[])
{
if (argc!=2)
{
cout<<"usage:->xml xmlFileName";
system("pause");
return 0;
}

string xmlContent = argv[1];
if(!readFromFile(xmlContent)){
return 0;
}

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: