📄 xmlite.cpp
字号:
return child;
XNodes::iterator it = child->childs.begin();
for( ; it != child->childs.end(); ++(it))
{
LPXNode find = child->Find( name );
if( find != NULL )
return find;
}
}
return NULL;
}
//========================================================
// Name : GetChildIterator
// Desc : get child nodes iterator
// Param :
// Return : NULL return if no childs.
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
XNodes::iterator _tagXMLNode::GetChildIterator( LPXNode node )
{
XNodes::iterator it = childs.begin();
for( ; it != childs.end() ; ++(it) )
{
if( *it == node )
return it;
}
return NULL;
}
//========================================================
// Name : AppendChild
// Desc : add node
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode _tagXMLNode::AppendChild( LPCTSTR name /*= NULL*/, LPCTSTR value /*= NULL*/ )
{
return AppendChild( CreateNode( name, value ) );
}
//========================================================
// Name : AppendChild
// Desc : add node
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode _tagXMLNode::AppendChild( LPXNode node )
{
node->parent = this;
node->doc = doc;
childs.push_back( node );
return node;
}
//========================================================
// Name : RemoveChild
// Desc : detach node and delete object
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
bool _tagXMLNode::RemoveChild( LPXNode node )
{
XNodes::iterator it = GetChildIterator( node );
if( it )
{
delete *it;
childs.erase( it );
return true;
}
return false;
}
//========================================================
// Name : GetAttr
// Desc : get attribute with index in attribute list
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr _tagXMLNode::GetAttr( int i )
{
if( i >= 0 && i < attrs.size() )
return attrs[i];
return NULL;
}
//========================================================
// Name : GetAttrIterator
// Desc : get attribute iterator
// Param :
// Return : std::vector<LPXAttr>::iterator
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
XAttrs::iterator _tagXMLNode::GetAttrIterator( LPXAttr attr )
{
XAttrs::iterator it = attrs.begin();
for( ; it != attrs.end() ; ++(it) )
{
if( *it == attr )
return it;
}
return NULL;
}
//========================================================
// Name : AppendAttr
// Desc : add attribute
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr _tagXMLNode::AppendAttr( LPXAttr attr )
{
attr->parent = this;
attrs.push_back( attr );
return attr;
}
//========================================================
// Name : RemoveAttr
// Desc : detach attribute and delete object
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
bool _tagXMLNode::RemoveAttr( LPXAttr attr )
{
XAttrs::iterator it = GetAttrIterator( attr );
if( it )
{
delete *it;
attrs.erase( it );
return true;
}
return false;
}
//========================================================
// Name : CreateNode
// Desc : Create node object and return it
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode _tagXMLNode::CreateNode( LPCTSTR name /*= NULL*/, LPCTSTR value /*= NULL*/ )
{
LPXNode node = new XNode;
node->name = name;
node->value = value;
return node;
}
//========================================================
// Name : CreateAttr
// Desc : create Attribute object and return it
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr _tagXMLNode::CreateAttr( LPCTSTR name /*= NULL*/, LPCTSTR value /*= NULL*/ )
{
LPXAttr attr = new XAttr;
attr->name = name;
attr->value = value;
return attr;
}
//========================================================
// Name : AppendAttr
// Desc : add attribute
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr _tagXMLNode::AppendAttr( LPCTSTR name /*= NULL*/, LPCTSTR value /*= NULL*/ )
{
return AppendAttr( CreateAttr( name, value ) );
}
//========================================================
// Name : DetachChild
// Desc : no delete object, just detach in list
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode _tagXMLNode::DetachChild( LPXNode node )
{
XNodes::iterator it = GetChildIterator( node );
if( it )
{
childs.erase( it );
return node;
}
return NULL;
}
//========================================================
// Name : DetachAttr
// Desc : no delete object, just detach in list
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr _tagXMLNode::DetachAttr( LPXAttr attr )
{
XAttrs::iterator it = GetAttrIterator( attr );
if( it )
{
attrs.erase( it );
return attr;
}
return NULL;
}
//========================================================
// Name : CopyNode
// Desc : copy current level node with own attributes
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
void _tagXMLNode::CopyNode( LPXNode node )
{
Close();
doc = node->doc;
parent = node->parent;
name = node->name;
value = node->value;
type = node->type;
// copy attributes
for( int i = 0 ; i < node->attrs.size(); i++)
{
LPXAttr attr = node->attrs[i];
if( attr )
AppendAttr( attr->name, attr->value );
}
}
//========================================================
// Name : _CopyBranch
// Desc : recursive internal copy branch
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
void _tagXMLNode::_CopyBranch( LPXNode node )
{
CopyNode( node );
for( int i = 0 ; i < node->childs.size(); i++)
{
LPXNode child = node->childs[i];
if( child )
{
LPXNode mychild = new XNode;
mychild->CopyNode( child );
AppendChild( mychild );
mychild->_CopyBranch( child );
}
}
}
//========================================================
// Name : AppendChildBranch
// Desc : add child branch ( deep-copy )
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode _tagXMLNode::AppendChildBranch( LPXNode node )
{
LPXNode child = new XNode;
child->CopyBranch( node );
return AppendChild( child );
}
//========================================================
// Name : CopyBranch
// Desc : copy branch ( deep-copy )
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
void _tagXMLNode::CopyBranch( LPXNode branch )
{
Close();
_CopyBranch( branch );
}
_tagXMLEntitys::_tagXMLEntitys( LPXENTITY entities, int count )
{
for( int i = 0; i < count; i++)
push_back( entities[i] );
}
LPXENTITY _tagXMLEntitys::GetEntity( int entity )
{
for( int i = 0 ; i < size(); i ++ )
{
if( at(i).entity == entity )
return LPXENTITY(&at(i));
}
return NULL;
}
LPXENTITY _tagXMLEntitys::GetEntity( LPTSTR entity )
{
for( int i = 0 ; i < size(); i ++ )
{
LPTSTR ref = (LPTSTR)at(i).ref;
LPTSTR ps = entity;
while( ref && *ref )
if( *ref++ != *ps++ )
break;
if( ref && !*ref ) // found!
return LPXENTITY(&at(i));
}
return NULL;
}
int _tagXMLEntitys::GetEntityCount( LPCTSTR str )
{
int nCount = 0;
LPTSTR ps = (LPTSTR)str;
while( ps && *ps )
if( GetEntity( *ps++ ) ) nCount ++;
return nCount;
}
int _tagXMLEntitys::Ref2Entity( LPCTSTR estr, LPTSTR str, int strlen )
{
LPTSTR pes = (LPTSTR)estr;
LPTSTR ps = str;
LPTSTR ps_end = ps+strlen;
while( pes && *pes && ps < ps_end )
{
LPXENTITY ent = GetEntity( pes );
if( ent )
{
// copy entity meanning char
*ps = ent->entity;
pes += ent->ref_len;
}
else
*ps = *pes++; // default character copy
ps++;
}
*ps = '\0';
// total copied characters
return ps-str;
}
int _tagXMLEntitys::Entity2Ref( LPCTSTR str, LPTSTR estr, int estrlen )
{
LPTSTR ps = (LPTSTR)str;
LPTSTR pes = (LPTSTR)estr;
LPTSTR pes_end = pes+estrlen;
while( ps && *ps && pes < pes_end )
{
LPXENTITY ent = GetEntity( *ps );
if( ent )
{
// copy entity string
LPTSTR ref = (LPTSTR)ent->ref;
while( ref && *ref )
*pes++ = *ref++;
}
else
*pes++ = *ps; // default character copy
ps++;
}
*pes = '\0';
// total copied characters
return pes-estr;
}
CString _tagXMLEntitys::Ref2Entity( LPCTSTR estr )
{
CString es;
if( estr )
{
int len = _tcslen(estr);
LPTSTR esbuf = es.GetBufferSetLength( len+1 );
if( esbuf )
Ref2Entity( estr, esbuf, len );
}
return es;
}
CString _tagXMLEntitys::Entity2Ref( LPCTSTR str )
{
CString s;
if( str )
{
int nEntityCount = GetEntityCount(str);
if( nEntityCount == 0 )
return CString(str);
int len = _tcslen(str) + nEntityCount*10 ;
LPTSTR sbuf = s.GetBufferSetLength( len+1 );
if( sbuf )
Entity2Ref( str, sbuf, len );
}
return s;
}
CString XRef2Entity( LPCTSTR estr )
{
return entityDefault.Ref2Entity( estr );
}
CString XEntity2Ref( LPCTSTR str )
{
return entityDefault.Entity2Ref( str );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -