加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

跨平台XML类,xml.cpp

(2005-05-26 10:50:11)
标签:

杂谈

分类: 计算机与 Internet

#include "xml.h"
#include <iostream>

string CXML::CreateNode(string name,string value) {
 Escape(name);
 if ( value == "" ) {
  return "<"+name+"/>\n";
 }

 return "<"+name+">" + value + "</"+name+">\n";
}

string CXML::GetNode(string xml,string name) {
 Escape(name);
 int begin = -1;
 int end = -1;
 begin = xml.find("<"+name+">")+name.size()+2;
 end = xml.rfind("</"+name+">");

 if ( 0 <= begin && begin <= end ) {
  return xml.substr( begin, end-begin );
 }
 return "";
}
string CXML::GetNode(string xml,string name,int &start)
{
 Escape(name);
 int begin = -1;
 int end = -1;
 begin = xml.find("<"+name+">",start)+name.size()+2;
 end = xml.find("</"+name+">",start);

    start=begin;
 if ( 0 <= begin && begin <= end )
 {
  return xml.substr( begin, end-begin );
 }
 return "";
}

bool CXML::GetNextNode(string xml,string &name,string &value,unsigned long &start)
{
 if(start>=xml.length ())
  return false;
 int namebegin=xml.find ("<",start);
 if(namebegin<0)return false;

 int nameend=xml.find(">",start);
 if(nameend<0)return false;

 name=xml.substr (namebegin+1,nameend-namebegin-1);
 if((name.length ()>0)&&(name[name.length ()-1]=='/'))
 {
  name=name.substr (0,name.length ()-1);
  value="";
  start=nameend+1;
  return true;
 }
 int valuebegin=nameend+1;

 int valueend=xml.find ("</"+name+">",valuebegin);
 if(valueend<0)return false;

 value=xml.substr (valuebegin,valueend-valuebegin);
 start=valueend+name.length ()+3;

 deEscape(name);
 return true;
}


//检测是否存在<name> 或</name>或 <name/>
bool CXML::isExistNode(string xml,string name) {
 Escape(name);
 int begin = -1;
 int end = -1;

 begin = xml.find("<"+name+"/>");
 if ( begin != -1 )
 {
  return true;
 }

 begin = xml.find("<"+name+">");
 end = xml.rfind("</"+name+">");

 if ( 0 <= begin && begin+name.size()+2 <= end ) {
  return true;
 }
 

 return false;
}

bool CXML::SetNode(string &xml,string name,string value)
{
 string newnode=CreateNode(name,value);

 Escape(name);
 int begin = -1;
 int end = -1;
 begin = xml.find("<"+name+">");
 end = xml.rfind("</"+name+">");

 if ( (0 <= begin) && (begin+name.size()+2 <= end ))
 {
  string left=xml.substr (0,begin);
  if((end+name.length ()+3<xml.length ())&&(xml[end+name.length ()+3]=='\n'))
   end++;
  string right=xml.substr (end+name.length ()+3,xml.length ());
  xml=left+newnode+right;
  return true;
 }
 
 begin = xml.find("<"+name+"/>");
 if ( begin != -1 )
 {
  string left=xml.substr (0,begin);
  if((begin+name.length ()+3<xml.length ())&&(xml[begin+name.length ()+3]=='\n'))
   begin++;
  string right=xml.substr (begin+name.length ()+3,xml.length ());
  xml=left+newnode+right;
  return true;
 }
 xml+=newnode;
 return false;
}


string CXML::Escape(string s) {
 string str = s;
 int size = str.size();
 for ( int i=0; i<size; i++ ) {
  switch (str[i]) {
  case '&':
   str = str.substr(0,i) + "&amp;" + str.substr(i+1);
   i += 4;
   size += 4;
   break;
  case '<':
   str = str.substr(0,i) + "&it;" + str.substr(i+1);
   i += 3;
   size += 3;
   break;
  case '>':
   str = str.substr(0,i) + "&gt;" + str.substr(i+1);
   i += 3;
   size += 3;
   break;
  case '"':
   str = str.substr(0,i) + "&quot;" + str.substr(i+1);
   i += 5;
   size += 5;
   break;
  case '\'':
   str = str.substr(0,i) + "&apos;" + str.substr(i+1);
   i += 5;
   size += 5;
   break;
  }
 }
 return str;
}

void CXML::deEscapeHelp(string &str,string old,char newChar) {
 int index = 0;
 while ( index != -1 ) {
  index = str.find(old,index);
  if ( index != -1 ) {
   str = str.substr(0,index) + newChar + str.substr(index+old.size());
  }
 }
}

string CXML::deEscape(string s) {
 string str = s;
 deEscapeHelp( str, "&amp;", '&');
 deEscapeHelp( str, "&it;", '<' );
 deEscapeHelp( str, "&gt;", '>' );
 deEscapeHelp( str, "&quot;", '"' );
 deEscapeHelp( str, "&apos;", '\'' );
 return str;
}


bool CXML::RemoveNode(string &xml, string name)
{
 Escape(name);
 int begin = -1;
 int end = -1;
 begin = xml.find("<"+name+">");
 end = xml.rfind("</"+name+">");

 if ( (0 <= begin) && (begin+name.size()+2 <= end ))
 {
  string left=xml.substr (0,begin);
  if((end+name.length ()+3<xml.length ())&&(xml[end+name.length ()+3]=='\n'))
   end++;
  string right=xml.substr (end+name.length ()+3,xml.length ());
  xml=left+right;
  return true;
 }
 
 begin = xml.find("<"+name+"/>");
 if ( begin != -1 )
 {
  string left=xml.substr (0,begin);
  if((begin+name.length ()+3<xml.length ())&&(xml[begin+name.length ()+3]=='\n'))
   begin++;
  string right=xml.substr (begin+name.length ()+3,xml.length ());
  xml=left+right;
  return true;
 }
 return false;
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有