tinyxml2 源码分析(二)

tinyxml2 源码分析(二)

主要分析XMLPrinter的实现和内存管理。

XMLPrinter的实现:

如果事先有大致浏览tinyxml2.h,就知道打印XML文档时使用了Visitor模式。所以看下面的分析至少要对Visitor模式有初步的认识。

先查看tinyxml2的文档,依照上篇博客的分析方法。跟踪函数的调用。

XMLPrinter printer;
doc.Print( &printer );

输出XML文档需要创建XMLPrinter对象,并将指针传递给XMLDocument::Print()函数
Print()函数定义如下

void XMLDocument::Print( XMLPrinter* streamer ) const
{
    XMLPrinter stdStreamer( stdout );
    if ( !streamer ) {
        streamer = &stdStreamer;
    }
    Accept( streamer );
}

从这里开始开始了Visitor模式。

这里的Accept()和常见的写法不太一样,额外增加了两个函数:VisitorEnter() VisitorExit(),由于此时的visitor指针实际上指向的是XMLPrinter,所以会调用子类的虚函数

bool XMLDocument::Accept( XMLVisitor* visitor ) const
{
    TIXMLASSERT( visitor );
    // 调用XMLPrinter::VisitEnter()
    if ( visitor->VisitEnter( *this ) ) {
    // ...
    }
    // 因为XMLPrinter并未重载VisitExit,所以调用XMLVisitor::VisitExit()
    return visitor->VisitExit( *this );
}

而这个函数主要是通过PushHeader()来输出一个BOM头而已(这里就不展开了)

bool XMLPrinter::VisitEnter( const XMLDocument& doc )
{
    _processEntities = doc.ProcessEntities();
    if ( doc.HasBOM() ) {
        PushHeader( true, false );  // 输出BOM头
    }
    return true;
}

再看XMLDocument::Accept()函数

    if ( visitor->VisitEnter( *this ) ) {
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值