82 DBG << tag_r << node_r << endl;
99 typedef std::map<std::string, ImplPtr>
SubNodes;
102 Impl(
const std::string & name_r,
Mode mode_r,
const shared_ptr<ParseDefConsume> & target_r = shared_ptr<ParseDefConsume>() )
115 it->second->_parent = NULL;
136 SubNodes::const_iterator it =
_subnodes.find( name_r );
155 std::string
exstr(
const std::string & what_r,
const Impl & impl_r )
const
157 std::ostringstream str;
158 str << impl_r <<
": " << what_r;
161 std::string
exstr(
const std::string & what_r,
const Impl & impl_r,
const Reader & reader_r )
const
163 std::ostringstream str;
164 str << impl_r <<
": " << what_r <<
" |reading " << *reader_r;
188 std::pair<SubNodes::iterator, bool> res
189 =
_subnodes.insert( std::make_pair( subnode_r->_name, subnode_r ) );
195 if ( res.first->second->_parent )
199 res.first->second->_parent =
this;
209 if ( reader_r->
nodeType() != XML_READER_TYPE_ELEMENT )
211 if ( reader_r->
depth() == 0 )
220 }
while( reader_r->
nodeType() != XML_READER_TYPE_ELEMENT );
227 if ( reader_r->
name() != _name )
231 if ( _visited >= 1 && !
multiDef() )
238 _parseDepth = reader_r->
depth();
241 _callback.start( *reader_r );
250 for (
bool done =
false; ! done ; )
260 case XML_READER_TYPE_ELEMENT:
267 _callback.startSubnode( *reader_r );
268 sub->take( reader_r );
269 _callback.doneSubnode( *reader_r );
274 WAR <<
"Skip unknown node " << *reader_r <<
" in "<< *
this << endl;
275 skipNode( reader_r );
280 case XML_READER_TYPE_END_ELEMENT:
282 if ( reader_r->
depth() == _parseDepth
283 && reader_r->
name() == _name )
293 case XML_READER_TYPE_TEXT:
295 _callback.text( *reader_r );
298 case XML_READER_TYPE_CDATA:
300 _callback.cdata( *reader_r );
312 for ( SubNodes::iterator it = _subnodes.begin(); it != _subnodes.end(); ++it )
314 if ( ! it->second->_visited && it->second->isMandatory() )
318 it->second->_visited = 0;
321 _callback.done( *reader_r );
335 ( exstr(
str::form(
"EOF while looking for [%d] <\\%s>",
350 return str <<
"ParseDef(" << obj.
_name
374 : _pimpl( new
Impl( name_r, mode_r, target_r ) )
451 #define X(T) case ParseDef::T: return str << #T
454 X(MULTIPLE_OPTIONAL);
455 X(MULTIPLE_MANDTAORY);