Qt之TinyXML2

1.TinyXml2简介

Qt没有引入QtXml模块以前,采用第三方库解析Xml数据是不得已的选择,其中Tinyxml2在c++的xml解析库中是个不错的选择。先前项目使用Tinyxml作为底层XML解析库,升级为TinyXML2后文件减少成2个,接口也发生很多变化。

2.TinyXml2 类之间的关系

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

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值