#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) + "&" +
str.substr(i+1);
i += 4;
size += 4;
break;
case '<':
str = str.substr(0,i) + "⁢" +
str.substr(i+1);
i += 3;
size += 3;
break;
case '>':
str = str.substr(0,i) + ">" +
str.substr(i+1);
i += 3;
size += 3;
break;
case '"':
str = str.substr(0,i) + """
+ str.substr(i+1);
i += 5;
size += 5;
break;
case '\'':
str = str.substr(0,i) + "'"
+ 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, "&",
'&');
deEscapeHelp( str, "⁢", '<'
);
deEscapeHelp( str, ">", '>'
);
deEscapeHelp( str, """, '"' );
deEscapeHelp( str, "'", '\'' );
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;
}