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 ) ) {