12 #include <libxml/xmlreader.h>
13 #include <libxml/xmlerror.h>
37 int ioread(
void * context_r,
char * buffer_r,
int bufferLen_r )
39 if ( context_r && buffer_r )
41 return reinterpret_cast<InputStream *
>(context_r)
42 ->stream().read( buffer_r, bufferLen_r ).gcount();
44 INT <<
"XML parser error: null pointer check failed " << context_r <<
' ' << (
void *)buffer_r << endl;
52 std::list<std::string> structuredErrors;
53 void structuredErrorFunc(
void * userData, xmlErrorPtr error )
60 structuredErrors.push_back( err );
66 #define X(m) SEC << " " << #m << "\t" << error->m << endl
67 #define XS(m) SEC << " " << #m << "\t" << (error->m?error->m:"NA") << endl
87 struct ParseException :
public Exception
90 : Exception(
"Parse error: " + ( structuredErrors.empty() ?
std::string(
"unknown error"): structuredErrors.back() ) )
92 for_( it, structuredErrors.begin(), --structuredErrors.end() )
108 : _stream( stream_r )
109 , _reader( xmlReaderForIO( ioread, ioclose, &_stream,
110 stream_r.path().
asString().c_str(), "utf-8", XML_PARSE_PEDANTIC ) )
113 MIL <<
"Start Parsing " << _stream << endl;
114 if ( ! _reader || ! stream_r.stream().good() )
118 structuredErrors.clear();
119 xmlTextReaderSetStructuredErrorHandler( _reader, structuredErrorFunc, NULL );
135 xmlFreeTextReader( _reader );
137 MIL <<
"Done Parsing " << _stream << endl;
142 if ( ! _node.isEmptyElement() )
146 if ( _node.nodeType() == XML_READER_TYPE_TEXT )
148 return _node.value();
162 int ret = xmlTextReaderRead( _reader );
167 xmlTextReaderClose( _reader );
182 int ret = xmlTextReaderMoveToNextAttribute( _reader );
203 xmlTextReaderClose( _reader );
216 if ( _node.depth() == depth_r
217 && _node.name() == name_r
218 && _node.nodeType() == XML_READER_TYPE_ELEMENT )
222 }
while( nextNode() );
237 if ( _node.depth() == depth_r
238 && _node.name() == name_r
239 && ( _node.nodeType() == XML_READER_TYPE_END_ELEMENT
240 || ( _node.nodeType() == XML_READER_TYPE_ELEMENT
241 && _node.isEmptyElement() ) ) )
245 }
while( nextNode() );