简单的XML解析程序

/*
*标 题: 简单的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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值