Blame xmpsdk/src/XML_Node.cpp

Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// Copyright 2005-2007 Adobe Systems Incorporated
Packit Service 21b5d1
// All Rights Reserved.
Packit Service 21b5d1
//
Packit Service 21b5d1
// NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the terms
Packit Service 21b5d1
// of the Adobe license agreement accompanying it.
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
Packit Service 21b5d1
#include "XMP_Environment.h"	// ! Must be the first #include!
Packit Service 21b5d1
#include "XMLParserAdapter.hpp"
Packit Service 21b5d1
Packit Service 21b5d1
#include <map>
Packit Service 21b5d1
#include <cstring>
Packit Service 21b5d1
#include <cstdio>
Packit Service 21b5d1
Packit Service 21b5d1
// ! Can't include XMP..._Impl.hpp - used by both Core and Files.
Packit Service 21b5d1
#define XMP_LitNMatch(s,l,n)	(std::strncmp((s),(l),(n)) == 0)
Packit Service 21b5d1
Packit Service 21b5d1
#if XMP_WinBuild
Packit Service 21b5d1
#ifdef _MSC_VER
Packit Service 21b5d1
	#define snprintf _snprintf
Packit Service 21b5d1
	#pragma warning ( disable : 4996 )	// snprintf is safe
Packit Service 21b5d1
#endif
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
Packit Service 21b5d1
#if 0	// Pattern for iterating over the children or attributes:
Packit Service 21b5d1
	for ( size_t xxNum = 0, xxLim = _node_->_offspring_->size(); xxNum < xxLim; ++xxNum ) {
Packit Service 21b5d1
		const XML_NodePtr _curr_ = _node_->_offspring_[xxNum];
Packit Service 21b5d1
	}
Packit Service 21b5d1
#endif
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::IsWhitespaceNode
Packit Service 21b5d1
//===========================
Packit Service 21b5d1
Packit Service 21b5d1
bool XML_Node::IsWhitespaceNode() const
Packit Service 21b5d1
{
Packit Service 21b5d1
	if ( this->kind != kCDataNode ) return false;
Packit Service 21b5d1
Packit Service 21b5d1
	for ( size_t i = 0; i < this->value.size(); ++i ) {
Packit Service 21b5d1
		unsigned char ch = this->value[i];
Packit Service 21b5d1
		if ( IsWhitespaceChar ( ch ) ) continue;
Packit Service 21b5d1
		// *** Add checks for other whitespace characters.
Packit Service 21b5d1
		return false;	// All the checks failed, this isn't whitespace.
Packit Service 21b5d1
	}
Packit Service 21b5d1
Packit Service 21b5d1
	return true;
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::IsWhitespaceNode
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::IsLeafContentNode
Packit Service 21b5d1
//============================
Packit Service 21b5d1
Packit Service 21b5d1
bool XML_Node::IsLeafContentNode() const
Packit Service 21b5d1
{
Packit Service 21b5d1
	if ( this->kind != kElemNode ) return false;
Packit Service 21b5d1
	if ( this->content.size() == 0 ) return true;
Packit Service 21b5d1
	if ( this->content.size() > 1 ) return false;
Packit Service 21b5d1
	if ( this->content[0]->kind != kCDataNode ) return false;
Packit Service 21b5d1
Packit Service 21b5d1
	return true;
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::IsLeafContentNode
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::IsEmptyLeafNode
Packit Service 21b5d1
//==========================
Packit Service 21b5d1
Packit Service 21b5d1
bool XML_Node::IsEmptyLeafNode() const
Packit Service 21b5d1
{
Packit Service 21b5d1
Packit Service 21b5d1
	if ( (this->kind != kElemNode) || (this->content.size() != 0) ) return false;
Packit Service 21b5d1
	return true;
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::IsEmptyLeafNode
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::GetAttrValue
Packit Service 21b5d1
//=======================
Packit Service 21b5d1
Packit Service 21b5d1
XMP_StringPtr XML_Node::GetAttrValue ( XMP_StringPtr attrName ) const
Packit Service 21b5d1
{
Packit Service 21b5d1
Packit Service 21b5d1
	for ( size_t i = 0, aLim = this->attrs.size(); i < aLim; ++i ) {
Packit Service 21b5d1
		XML_Node * attrPtr = this->attrs[i];
Packit Service 21b5d1
		if ( ! attrPtr->ns.empty() ) continue;	// This form of GetAttrValue is for attrs in no namespace.
Packit Service 21b5d1
		if ( attrPtr->name == attrName ) return attrPtr->value.c_str();
Packit Service 21b5d1
	}
Packit Service 21b5d1
	
Packit Service 21b5d1
	return 0;	// Not found.
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::GetAttrValue
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::SetAttrValue
Packit Service 21b5d1
//=======================
Packit Service 21b5d1
Packit Service 21b5d1
void XML_Node::SetAttrValue ( XMP_StringPtr attrName, XMP_StringPtr attrValue )
Packit Service 21b5d1
{
Packit Service 21b5d1
	
Packit Service 21b5d1
	for ( size_t i = 0, aLim = this->attrs.size(); i < aLim; ++i ) {
Packit Service 21b5d1
		XML_Node * attrPtr = this->attrs[i];
Packit Service 21b5d1
		if ( ! attrPtr->ns.empty() ) continue;	// This form of SetAttrValue is for attrs in no namespace.
Packit Service 21b5d1
		if ( attrPtr->name == attrName ) {
Packit Service 21b5d1
			attrPtr->value = attrValue;
Packit Service 21b5d1
			return;
Packit Service 21b5d1
		}
Packit Service 21b5d1
	}
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::SetAttrValue
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::GetLeafContentValue
Packit Service 21b5d1
//==============================
Packit Service 21b5d1
Packit Service 21b5d1
XMP_StringPtr XML_Node::GetLeafContentValue() const
Packit Service 21b5d1
{
Packit Service 21b5d1
	if ( (! this->IsLeafContentNode()) || this->content.empty() ) return "";
Packit Service 21b5d1
Packit Service 21b5d1
	return this->content[0]->value.c_str();
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::GetLeafContentValue
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::SetLeafContentValue
Packit Service 21b5d1
//==============================
Packit Service 21b5d1
Packit Service 21b5d1
void XML_Node::SetLeafContentValue ( XMP_StringPtr newValue )
Packit Service 21b5d1
{
Packit Service 21b5d1
	XML_Node * valueNode;
Packit Service 21b5d1
	
Packit Service 21b5d1
	if ( ! this->content.empty() ) {
Packit Service 21b5d1
		valueNode = this->content[0];
Packit Service 21b5d1
	} else {
Packit Service 21b5d1
		valueNode = new XML_Node ( this, "", kCDataNode );
Packit Service 21b5d1
		this->content.push_back ( valueNode );
Packit Service 21b5d1
	}
Packit Service 21b5d1
Packit Service 21b5d1
	valueNode->value = newValue;
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::SetLeafContentValue
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::CountNamedElements
Packit Service 21b5d1
//=============================
Packit Service 21b5d1
Packit Service 21b5d1
size_t XML_Node::CountNamedElements ( XMP_StringPtr nsURI, XMP_StringPtr localName ) const
Packit Service 21b5d1
{
Packit Service 21b5d1
	size_t count = 0;
Packit Service 21b5d1
	
Packit Service 21b5d1
	for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) {
Packit Service 21b5d1
		const XML_Node & child = *this->content[i];
Packit Service 21b5d1
		if ( child.ns != nsURI ) continue;
Packit Service 21b5d1
		if ( strcmp ( localName, child.name.c_str()+child.nsPrefixLen ) != 0 ) continue;
Packit Service 21b5d1
		++count;
Packit Service 21b5d1
	}
Packit Service 21b5d1
	
Packit Service 21b5d1
	return count;
Packit Service 21b5d1
	
Packit Service 21b5d1
}	// XML_Node::CountNamedElements
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::GetNamedElement
Packit Service 21b5d1
//==========================
Packit Service 21b5d1
Packit Service 21b5d1
XML_NodePtr XML_Node::GetNamedElement ( XMP_StringPtr nsURI, XMP_StringPtr localName, size_t which /* = 0 */ )
Packit Service 21b5d1
{
Packit Service 21b5d1
Packit Service 21b5d1
	for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) {
Packit Service 21b5d1
		XML_Node * childPtr = this->content[i];
Packit Service 21b5d1
		if ( childPtr->ns != nsURI ) continue;
Packit Service 21b5d1
		if ( strcmp ( localName, childPtr->name.c_str()+childPtr->nsPrefixLen ) != 0 ) continue;
Packit Service 21b5d1
		if ( which == 0 ) return childPtr;
Packit Service 21b5d1
		--which;
Packit Service 21b5d1
	}
Packit Service 21b5d1
	
Packit Service 21b5d1
	return 0;	/// Not found.
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::GetNamedElement
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// DumpNodeList
Packit Service 21b5d1
// ============
Packit Service 21b5d1
Packit Service 21b5d1
static const char * kNodeKinds[] = { "root", "elem", "attr", "cdata", "pi" };
Packit Service 21b5d1
Packit Service 21b5d1
static void DumpNodeList ( std::string * buffer, const XML_NodeVector & list, int indent )
Packit Service 21b5d1
{
Packit Service 21b5d1
Packit Service 21b5d1
	for ( size_t i = 0, limit = list.size(); i < limit; ++i ) {
Packit Service 21b5d1
Packit Service 21b5d1
		const XML_Node * node = list[i];
Packit Service 21b5d1
		
Packit Service 21b5d1
		for ( int t = indent; t > 0; --t ) *buffer += "  ";
Packit Service 21b5d1
		if ( node->IsWhitespaceNode() ) {
Packit Service 21b5d1
			*buffer += "-- whitespace --\n";
Packit Service 21b5d1
			continue;
Packit Service 21b5d1
		}
Packit Service 21b5d1
Packit Service 21b5d1
		*buffer += node->name;
Packit Service 21b5d1
		*buffer += " - ";
Packit Service 21b5d1
		*buffer += kNodeKinds[node->kind];
Packit Service 21b5d1
		if ( ! node->value.empty() ) {
Packit Service 21b5d1
			*buffer += ", value=\"";
Packit Service 21b5d1
			*buffer += node->value;
Packit Service 21b5d1
			*buffer += "\"";
Packit Service 21b5d1
		}
Packit Service 21b5d1
		if ( ! node->ns.empty() ) {
Packit Service 21b5d1
			*buffer += ", ns=\"";
Packit Service 21b5d1
			*buffer += node->ns;
Packit Service 21b5d1
			*buffer += "\"";
Packit Service 21b5d1
		}
Packit Service 21b5d1
		if ( node->nsPrefixLen != 0 ) {
Packit Service 21b5d1
			*buffer += ", prefixLen=";
Packit Service 21b5d1
			char numBuf [20];
Packit Service 21b5d1
			snprintf ( numBuf, sizeof(numBuf), "%lu", (unsigned long)node->nsPrefixLen );
Packit Service 21b5d1
			*buffer += numBuf;
Packit Service 21b5d1
		}
Packit Service 21b5d1
		*buffer += "\n";
Packit Service 21b5d1
	
Packit Service 21b5d1
		if ( ! node->attrs.empty() ) {
Packit Service 21b5d1
			for ( int t = indent+1; t > 0; --t ) *buffer += "  ";
Packit Service 21b5d1
			*buffer += "attrs:\n";
Packit Service 21b5d1
			DumpNodeList ( buffer, node->attrs, indent+2 );
Packit Service 21b5d1
		}
Packit Service 21b5d1
		
Packit Service 21b5d1
		if ( ! node->content.empty() ) {
Packit Service 21b5d1
			DumpNodeList ( buffer, node->content, indent+1 );
Packit Service 21b5d1
		}
Packit Service 21b5d1
Packit Service 21b5d1
	}
Packit Service 21b5d1
Packit Service 21b5d1
}	// DumpNodeList
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::Dump
Packit Service 21b5d1
//===============
Packit Service 21b5d1
Packit Service 21b5d1
void XML_Node::Dump ( std::string * buffer )
Packit Service 21b5d1
{
Packit Service 21b5d1
Packit Service 21b5d1
	*buffer = "Dump of XML_Node tree\n";
Packit Service 21b5d1
Packit Service 21b5d1
	*buffer += "Root info: name=\"";
Packit Service 21b5d1
	*buffer += this->name;
Packit Service 21b5d1
	*buffer += "\", value=\"";
Packit Service 21b5d1
	*buffer += this->value;
Packit Service 21b5d1
	*buffer += "\", ns=\"";
Packit Service 21b5d1
	*buffer += this->ns;
Packit Service 21b5d1
	*buffer += "\", kind=";
Packit Service 21b5d1
	*buffer += kNodeKinds[this->kind];
Packit Service 21b5d1
	*buffer += "\n";
Packit Service 21b5d1
	
Packit Service 21b5d1
	if ( ! this->attrs.empty() ) {
Packit Service 21b5d1
		*buffer += "  attrs:\n";
Packit Service 21b5d1
		DumpNodeList ( buffer, this->attrs, 2 );
Packit Service 21b5d1
	}
Packit Service 21b5d1
	*buffer += "\n";
Packit Service 21b5d1
	
Packit Service 21b5d1
	DumpNodeList ( buffer, this->content, 0 );
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::Dump
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// SerializeOneNode
Packit Service 21b5d1
// ================
Packit Service 21b5d1
Packit Service 21b5d1
static void SerializeOneNode ( std::string * buffer, const XML_Node & node )
Packit Service 21b5d1
{
Packit Service 21b5d1
	size_t i, limit;
Packit Service 21b5d1
	XMP_StringPtr namePtr = node.name.c_str();
Packit Service 21b5d1
	if ( XMP_LitNMatch ( namePtr, "_dflt_:", 7 ) ) namePtr += 7;	// Hack for default namespaces.
Packit Service 21b5d1
Packit Service 21b5d1
	switch ( node.kind ) {
Packit Service 21b5d1
	
Packit Service 21b5d1
		case kElemNode:
Packit Service 21b5d1
			*buffer += '<';
Packit Service 21b5d1
			*buffer += namePtr;
Packit Service 21b5d1
			for ( i = 0, limit = node.attrs.size(); i < limit; ++i ) {
Packit Service 21b5d1
				SerializeOneNode ( buffer, *node.attrs[i] );
Packit Service 21b5d1
			}
Packit Service 21b5d1
			if ( node.content.empty() ) {
Packit Service 21b5d1
				*buffer += "/>";
Packit Service 21b5d1
			} else {
Packit Service 21b5d1
				*buffer += '>';
Packit Service 21b5d1
				for ( i = 0, limit = node.content.size(); i < limit; ++i ) {
Packit Service 21b5d1
					SerializeOneNode ( buffer, *node.content[i] );
Packit Service 21b5d1
				}
Packit Service 21b5d1
				*buffer += "</";
Packit Service 21b5d1
				*buffer += namePtr;
Packit Service 21b5d1
				*buffer += '>';
Packit Service 21b5d1
			}
Packit Service 21b5d1
			break;
Packit Service 21b5d1
	
Packit Service 21b5d1
		case kAttrNode:
Packit Service 21b5d1
			*buffer += ' ';
Packit Service 21b5d1
			*buffer += namePtr;
Packit Service 21b5d1
			*buffer += "=\"";
Packit Service 21b5d1
			*buffer += node.value;
Packit Service 21b5d1
			*buffer += '"';
Packit Service 21b5d1
			break;
Packit Service 21b5d1
	
Packit Service 21b5d1
		case kCDataNode:
Packit Service 21b5d1
			*buffer += node.value;
Packit Service 21b5d1
			break;
Packit Service 21b5d1
	
Packit Service 21b5d1
		case kPINode:
Packit Service 21b5d1
			*buffer += node.value;	// *** Note that we're dropping PIs during the Expat parse.
Packit Service 21b5d1
			break;
Packit Service 21b5d1
	
Packit Service 21b5d1
	}
Packit Service 21b5d1
Packit Service 21b5d1
}	// SerializeOneNode
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// CollectNamespaceDecls
Packit Service 21b5d1
// =====================
Packit Service 21b5d1
Packit Service 21b5d1
typedef std::map < std::string, std::string > NamespaceMap;
Packit Service 21b5d1
Packit Service 21b5d1
static void CollectNamespaceDecls ( NamespaceMap * nsMap, const XML_Node & node )
Packit Service 21b5d1
{
Packit Service 21b5d1
	size_t i, limit;
Packit Service 21b5d1
Packit Service 21b5d1
	if ( ! node.ns.empty() ) {
Packit Service 21b5d1
		size_t nameMid = 0;
Packit Service 21b5d1
		while ( node.name[nameMid] != ':' ) ++nameMid;
Packit Service 21b5d1
		std::string prefix = node.name.substr ( 0, nameMid );
Packit Service 21b5d1
		(*nsMap)[prefix] = node.ns;
Packit Service 21b5d1
	}
Packit Service 21b5d1
	
Packit Service 21b5d1
	if ( node.kind == kElemNode ) {
Packit Service 21b5d1
Packit Service 21b5d1
		for ( i = 0, limit = node.attrs.size(); i < limit; ++i ) {
Packit Service 21b5d1
			CollectNamespaceDecls ( nsMap, *node.attrs[i] );
Packit Service 21b5d1
		}
Packit Service 21b5d1
Packit Service 21b5d1
		for ( i = 0, limit = node.content.size(); i < limit; ++i ) {
Packit Service 21b5d1
			const XML_Node & content = *node.content[i];
Packit Service 21b5d1
			if ( content.kind == kElemNode ) CollectNamespaceDecls ( nsMap, content );
Packit Service 21b5d1
		}
Packit Service 21b5d1
Packit Service 21b5d1
	}
Packit Service 21b5d1
	
Packit Service 21b5d1
}	// CollectNamespaceDecls
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::Serialize
Packit Service 21b5d1
//====================
Packit Service 21b5d1
Packit Service 21b5d1
void XML_Node::Serialize ( std::string * buffer )
Packit Service 21b5d1
{
Packit Service 21b5d1
	buffer->erase();
Packit Service 21b5d1
	
Packit Service 21b5d1
	if ( this->kind != kRootNode ) {
Packit Service 21b5d1
Packit Service 21b5d1
		SerializeOneNode ( buffer, *this );
Packit Service 21b5d1
Packit Service 21b5d1
	} else {
Packit Service 21b5d1
	
Packit Service 21b5d1
		// Do the outermost level here, in order to add the XML version and namespace declarations.
Packit Service 21b5d1
Packit Service 21b5d1
		*buffer += "\n";
Packit Service 21b5d1
Packit Service 21b5d1
		for ( size_t outer = 0, oLimit = this->content.size(); outer < oLimit; ++outer ) {
Packit Service 21b5d1
Packit Service 21b5d1
			const XML_Node & node = *this->content[outer];
Packit Service 21b5d1
Packit Service 21b5d1
			if ( node.kind != kElemNode ) {
Packit Service 21b5d1
Packit Service 21b5d1
				SerializeOneNode ( buffer, node );
Packit Service 21b5d1
Packit Service 21b5d1
			} else {
Packit Service 21b5d1
Packit Service 21b5d1
				XMP_StringPtr namePtr = node.name.c_str();
Packit Service 21b5d1
				if ( XMP_LitNMatch ( namePtr, "_dflt_:", 7 ) ) namePtr += 7;	// Hack for default namespaces.
Packit Service 21b5d1
Packit Service 21b5d1
				*buffer += '<';
Packit Service 21b5d1
				*buffer += namePtr;
Packit Service 21b5d1
				
Packit Service 21b5d1
				NamespaceMap nsMap;
Packit Service 21b5d1
				CollectNamespaceDecls ( &nsMap, node );
Packit Service 21b5d1
				NamespaceMap::iterator nsDecl = nsMap.begin();
Packit Service 21b5d1
				NamespaceMap::iterator nsEnd  = nsMap.end();
Packit Service 21b5d1
				for ( ; nsDecl != nsEnd; ++nsDecl ) {
Packit Service 21b5d1
					const std::string & prefix = nsDecl->first;
Packit Service 21b5d1
					*buffer += " xmlns";
Packit Service 21b5d1
					if ( prefix != "_dflt_" ) { *buffer += ':'; *buffer += prefix; }
Packit Service 21b5d1
					*buffer += "=\"";
Packit Service 21b5d1
					*buffer += nsDecl->second;
Packit Service 21b5d1
					*buffer += '"';
Packit Service 21b5d1
				}
Packit Service 21b5d1
Packit Service 21b5d1
				for ( size_t attr = 0, aLimit = node.attrs.size(); attr < aLimit; ++attr ) {
Packit Service 21b5d1
					SerializeOneNode ( buffer, *node.attrs[attr] );
Packit Service 21b5d1
				}
Packit Service 21b5d1
Packit Service 21b5d1
				if ( node.content.empty() ) {
Packit Service 21b5d1
					*buffer += "/>";
Packit Service 21b5d1
				} else {
Packit Service 21b5d1
					*buffer += '>';
Packit Service 21b5d1
					for ( size_t child = 0, cLimit = node.content.size(); child < cLimit; ++child ) {
Packit Service 21b5d1
						SerializeOneNode ( buffer, *node.content[child] );
Packit Service 21b5d1
					}
Packit Service 21b5d1
					*buffer += "</";
Packit Service 21b5d1
					*buffer += namePtr;
Packit Service 21b5d1
					*buffer += '>';
Packit Service 21b5d1
				}
Packit Service 21b5d1
Packit Service 21b5d1
			}
Packit Service 21b5d1
Packit Service 21b5d1
		}
Packit Service 21b5d1
		
Packit Service 21b5d1
	}
Packit Service 21b5d1
	
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::Serialize
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::RemoveAttrs
Packit Service 21b5d1
//======================
Packit Service 21b5d1
Packit Service 21b5d1
void XML_Node::RemoveAttrs()
Packit Service 21b5d1
{
Packit Service 21b5d1
Packit Service 21b5d1
	for ( size_t i = 0, vLim = this->attrs.size(); i < vLim; ++i ) delete this->attrs[i];
Packit Service 21b5d1
	this->attrs.clear();
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::RemoveAttrs
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::RemoveContent
Packit Service 21b5d1
//========================
Packit Service 21b5d1
Packit Service 21b5d1
void XML_Node::RemoveContent()
Packit Service 21b5d1
{
Packit Service 21b5d1
Packit Service 21b5d1
	for ( size_t i = 0, vLim = this->content.size(); i < vLim; ++i ) delete this->content[i];
Packit Service 21b5d1
	this->content.clear();
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::RemoveContent
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================
Packit Service 21b5d1
// XML_Node::ClearNode
Packit Service 21b5d1
//====================
Packit Service 21b5d1
Packit Service 21b5d1
void XML_Node::ClearNode()
Packit Service 21b5d1
{
Packit Service 21b5d1
Packit Service 21b5d1
	this->kind = 0;
Packit Service 21b5d1
	this->ns.erase();
Packit Service 21b5d1
	this->name.erase();
Packit Service 21b5d1
	this->value.erase();
Packit Service 21b5d1
Packit Service 21b5d1
	this->RemoveAttrs();
Packit Service 21b5d1
	this->RemoveContent();
Packit Service 21b5d1
Packit Service 21b5d1
}	// XML_Node::ClearNode
Packit Service 21b5d1
Packit Service 21b5d1
// =================================================================================================