1.TinyXml2简介
Qt没有引入QtXml模块以前,采用第三方库解析Xml数据是不得已的选择,其中Tinyxml2在c++的xml解析库中是个不错的选择。先前项目使用Tinyxml作为底层XML解析库,升级为TinyXML2后文件减少成2个,接口也发生很多变化。
2.TinyXml2 类之间的关系
XMLNode是XMLComment、XMLDeclration、XMLDocument、XMLElement、XMLText、XMLUnknown等的基类。XMLHandle可以处理XMLNode类及其子类。
3. Memory Model
XMLDocument和其他任何C++对象一样,可以在堆栈上,也可以在堆上添加或删除。但是,文档的任何子节点XMLElement、XMLText等只能通过调用适当的XMLDocument::NewElement、NewText等来创建。尽管您有指向这些对象的指针,但它们仍归文档所有。当文档被删除时,它包含的所有节点也被删除。
XMLElement* XMLDocument::NewElement( const char* name )
{
XMLElement* ele = CreateUnlinkedNode<XMLElement>( _elementPool );
ele->SetName( name );
return ele;
}
XMLComment* XMLDocument::NewComment( const char* str )
{
XMLComment* comment = CreateUnlinkedNode<XMLComment>( _commentPool );
comment->SetValue( str );
return comment;
}
XMLText* XMLDocument::NewText( const char* str )
{
XMLText* text = CreateUnlinkedNode<XMLText>( _textPool );
text->SetValue( str );
return text;
}
CreateUnlinkedNode函数源码如下:
template<class NodeType, int PoolElementSize>
inline NodeType* XMLDocument::CreateUnlinkedNode( MemPoolT<PoolElementSize>& pool )
{
TIXMLASSERT( sizeof( NodeType ) == PoolElementSize );
TIXMLASSERT( sizeof( NodeType ) == pool.ItemSize() );
NodeType* returnNode = new (pool.Alloc()) NodeType( this );/* place new : new (Type*) Type */
TIXMLASSERT( returnNode );
returnNode->_memPool = &pool; /* xmlnode->_memPool指向_elementPool等 */
_unlinked.Push(returnNode);/* 定义: DynArray<XMLNode*, 10> _unlinked; */
return returnNode;
}
XMLDocument创建node都存进自己的内存池中。
/* DynArray类 */
void Push( T t ) {
TIXMLASSERT( _size < INT_MAX );
EnsureCapacity( _size+1 );
_mem[_size] = t;
++_size;
}
4. 参考资料
http://leethomason.github.io/tinyxml2/index.html
http://leethomason.github.io/tinyxml2/hierarchy.html