📄 xmlite.cpp
字号:
bool trim = pi->trim_value;
TCHAR escape = pi->escape_value;
//_SetString( xml, pEnd, &value, trim, chXMLEscape );
_SetString( xml, pEnd, &value, trim, escape );
xml = pEnd;
//TEXTVALUE
if( pi->entity_value && pi->entitys )
value = pi->entitys->Ref2Entity(value);
}
}
}
}
}
return xml;
}
// <?xml version='1.0'?>
// <TAG attr1="value1" attr2='value2' attr3=value3 >
// </TAG>
// or
// <TAG />
// ^- return pointer
//========================================================
// Name : Load
// Desc : load xml plain text for xml document
// Param : pszXml - plain xml text
// pi = parser information
// Return : advanced string pointer (error return NULL)
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPTSTR _tagXMLDocument::Load( LPCTSTR pszXml, LPPARSEINFO pi /*= NULL*/ )
{
LPXNode node = new XNode;
node->parent = (LPXNode)this;
node->type = XNODE_ELEMENT;
node->doc = this;
LPTSTR end;
if( pi == NULL )
pi = &parse_info;
if( (end = node->Load( pszXml, pi )) == NULL )
{
delete node;
return NULL;
}
childs.push_back( node );
// Load Other Node after </Tag>(pi, comment, CDATA etc)
LPTSTR ret;
bool bRet = false;
ret = LoadOtherNodes( node, &bRet, end, pi );
if( ret != NULL )
end = ret;
return end;
}
LPXNode _tagXMLDocument::GetRoot()
{
XNodes::iterator it = childs.begin();
for( ; it != childs.end() ; ++(it) )
{
LPXNode node = *it;
if( node->type == XNODE_ELEMENT )
return node;
}
return NULL;
}
//========================================================
// Name : GetXML
// Desc : convert plain xml text from parsed xml attirbute
// Param :
// Return : converted plain string
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
CString _tagXMLAttr::GetXML( LPDISP_OPT opt /*= &optDefault*/ )
{
std::ostringstream os;
//os << (LPCTSTR)name << "='" << (LPCTSTR)value << "' ";
os << (LPCTSTR)name << "=" << (char)opt->value_quotation_mark
<< (LPCTSTR)(opt->reference_value&&opt->entitys?opt->entitys->Entity2Ref(value):value)
<< (char)opt->value_quotation_mark << " ";
return os.str().c_str();
}
//========================================================
// Name : GetXML
// Desc : convert plain xml text from parsed xml node
// Param :
// Return : converted plain string
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
CString _tagXMLNode::GetXML( LPDISP_OPT opt /*= &optDefault*/ )
{
std::ostringstream os;
// tab
if( opt && opt->newline )
{
if( opt && opt->newline )
os << "\r\n";
for( int i = 0 ; i < opt->tab_base ; i++)
os << '\t';
}
if( type == XNODE_DOC )
{
for( int i = 0 ; i < childs.size(); i++ )
os << (LPCTSTR)childs[i]->GetXML( opt );
return os.str().c_str();
}
else
if( type == XNODE_PI )
{
// <?TAG
os << szXMLPIOpen << (LPCTSTR)name;
// <?TAG Attr1="Val1"
if( attrs.empty() == false ) os << ' ';
for( int i = 0 ; i < attrs.size(); i++ )
{
os << (LPCTSTR)attrs[i]->GetXML(opt);
}
//?>
os << szXMLPIClose;
return os.str().c_str();
}
else
if( type == XNODE_COMMENT )
{
// <--comment
os << szXMLCommentOpen << (LPCTSTR)value;
//-->
os << szXMLCommentClose;
return os.str().c_str();
}
else
if( type == XNODE_CDATA )
{
// <--comment
os << szXMLCDATAOpen << (LPCTSTR)value;
//-->
os << szXMLCDATAClose;
return os.str().c_str();
}
// <TAG
os << '<' << (LPCTSTR)name;
// <TAG Attr1="Val1"
if( attrs.empty() == false ) os << ' ';
for( int i = 0 ; i < attrs.size(); i++ )
{
os << (LPCTSTR)attrs[i]->GetXML(opt);
}
if( childs.empty() && value.IsEmpty() )
{
// <TAG Attr1="Val1"/> alone tag
os << "/>";
}
else
{
// <TAG Attr1="Val1"> and get child
os << '>';
if( opt && opt->newline && !childs.empty() )
{
opt->tab_base++;
}
for( int i = 0 ; i < childs.size(); i++ )
os << (LPCTSTR)childs[i]->GetXML( opt );
// Text Value
if( value != _T("") )
{
if( opt && opt->newline && !childs.empty() )
{
if( opt && opt->newline )
os << "\r\n";
for( int i = 0 ; i < opt->tab_base ; i++)
os << '\t';
}
os << (LPCTSTR)(opt->reference_value&&opt->entitys?opt->entitys->Entity2Ref(value):value);
}
// </TAG> CloseTag
if( opt && opt->newline && !childs.empty() )
{
os << "\r\n";
for( int i = 0 ; i < opt->tab_base-1 ; i++)
os << '\t';
}
os << "</" << (LPCTSTR)name << '>';
if( opt && opt->newline )
{
if( !childs.empty() )
opt->tab_base--;
}
}
return os.str().c_str();
}
//========================================================
// 窃荐疙 : GetText
// 汲 疙 : 畴靛 窍唱甫 咆胶飘 巩磊凯肺 馆券
// 牢 磊 :
// 府畔蔼 : 函券等 巩磊凯
//--------------------------------------------------------
// 累己磊 累己老 累己捞蜡
// 炼版刮 2004-06-15
//========================================================
CString _tagXMLNode::GetText( LPDISP_OPT opt /*= &optDefault*/ )
{
std::ostringstream os;
if( type == XNODE_DOC )
{
for( int i = 0 ; i < childs.size(); i++ )
os << (LPCTSTR)childs[i]->GetText( opt );
}
else
if( type == XNODE_PI )
{
// no text
}
else
if( type == XNODE_COMMENT )
{
// no text
}
else
if( type == XNODE_CDATA )
{
os << (LPCTSTR)value;
}
else
if( type == XNODE_ELEMENT )
{
if( childs.empty() && value.IsEmpty() )
{
// no text
}
else
{
// childs text
for( int i = 0 ; i < childs.size(); i++ )
os << (LPCTSTR)childs[i]->GetText();
// Text Value
os << (LPCTSTR)(opt->reference_value&&opt->entitys?opt->entitys->Entity2Ref(value):value);
}
}
return os.str().c_str();
}
//========================================================
// Name : GetAttr
// Desc : get attribute with attribute name
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXAttr _tagXMLNode::GetAttr( LPCTSTR attrname )
{
for( int i = 0 ; i < attrs.size(); i++ )
{
LPXAttr attr = attrs[i];
if( attr )
{
if( attr->name == attrname )
return attr;
}
}
return NULL;
}
//========================================================
// Name : GetAttrs
// Desc : find attributes with attribute name, return its list
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
XAttrs _tagXMLNode::GetAttrs( LPCTSTR name )
{
XAttrs attrs;
for( int i = 0 ; i < attrs.size(); i++ )
{
LPXAttr attr = attrs[i];
if( attr )
{
if( attr->name == name )
attrs.push_back( attr );
}
}
return attrs;
}
//========================================================
// Name : GetAttrValue
// Desc : get attribute with attribute name, return its value
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPCTSTR _tagXMLNode::GetAttrValue( LPCTSTR attrname )
{
LPXAttr attr = GetAttr( attrname );
return attr ? (LPCTSTR)attr->value : NULL;
}
XNodes _tagXMLNode::GetChilds()
{
return childs;
}
//========================================================
// Name : GetChilds
// Desc : Find childs with name and return childs list
// Param :
// Return :
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
XNodes _tagXMLNode::GetChilds( LPCTSTR name )
{
XNodes nodes;
for( int i = 0 ; i < childs.size(); i++ )
{
LPXNode node = childs[i];
if( node )
{
if( node->name == name )
nodes.push_back( node );
}
}
return nodes;
}
//========================================================
// Name : GetChild
// Desc : get child node with index
// Param :
// Return : NULL return if no child.
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode _tagXMLNode::GetChild( int i )
{
if( i >= 0 && i < childs.size() )
return childs[i];
return NULL;
}
//========================================================
// Name : GetChildCount
// Desc : get child node count
// Param :
// Return : 0 return if no child
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-12-26
//========================================================
int _tagXMLNode::GetChildCount()
{
return childs.size();
}
//========================================================
// Name : GetChild
// Desc : Find child with name and return child
// Param :
// Return : NULL return if no child.
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode _tagXMLNode::GetChild( LPCTSTR name )
{
for( int i = 0 ; i < childs.size(); i++ )
{
LPXNode node = childs[i];
if( node )
{
if( node->name == name )
return node;
}
}
return NULL;
}
//========================================================
// Name : GetChildValue
// Desc : Find child with name and return child's value
// Param :
// Return : NULL return if no child.
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPCTSTR _tagXMLNode::GetChildValue( LPCTSTR name )
{
LPXNode node = GetChild( name );
return (node != NULL)? (LPCTSTR)node->value : NULL;
}
CString _tagXMLNode::GetChildText( LPCTSTR name, LPDISP_OPT opt /*= &optDefault*/ )
{
LPXNode node = GetChild( name );
return (node != NULL)? node->GetText(opt) : _T("");
}
LPXAttr _tagXMLNode::GetChildAttr( LPCTSTR name, LPCTSTR attrname )
{
LPXNode node = GetChild(name);
return node ? node->GetAttr(attrname) : NULL;
}
LPCTSTR _tagXMLNode::GetChildAttrValue( LPCTSTR name, LPCTSTR attrname )
{
LPXAttr attr = GetChildAttr( name, attrname );
return attr ? (LPCTSTR)attr->value : NULL;
}
//========================================================
// Name : Find
// Desc : find node with tag name from it's all childs
// Param :
// Return : NULL return if no found node.
//--------------------------------------------------------
// Coder Date Desc
// bro 2002-10-29
//========================================================
LPXNode _tagXMLNode::Find( LPCTSTR name )
{
XNodes::iterator it = childs.begin();
for( ; it != childs.end(); ++(it))
{
LPXNode child = *it;
if( child->name == name )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -