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 << ' ' << static_cast<void *>(buffer_r) << endl;
52 std::list<std::string> structuredErrors;
53#if LIBXML_VERSION >= 21200
54 void structuredErrorFunc(
void * userData,
const xmlError * error )
56 void structuredErrorFunc(
void * userData, xmlError * error )
64 structuredErrors.push_back( err );
69 struct ParseException :
public Exception
72 : Exception(
"Parse error: " + ( structuredErrors.
empty() ? std::string(
"unknown error"): structuredErrors.back() ) )
74 for_( it, structuredErrors.begin(), --structuredErrors.end() )
92 stream_r.path().
asString().c_str(),
"utf-8", XML_PARSE_PEDANTIC ) )
96 if ( !
_reader || stream_r.stream().bad() )
100 structuredErrors.clear();
101 xmlTextReaderSetStructuredErrorHandler(
_reader, structuredErrorFunc, NULL );
124 if ( !
_node.isEmptyElement() )
128 if (
_node.nodeType() == XML_READER_TYPE_TEXT )
130 return _node.value();
144 int ret = xmlTextReaderRead(
_reader );
164 int ret = xmlTextReaderMoveToNextAttribute(
_reader );
198 if (
_node.depth() == depth_r
199 &&
_node.name() == name_r
200 &&
_node.nodeType() == XML_READER_TYPE_ELEMENT )
219 if (
_node.depth() == depth_r
220 &&
_node.name() == name_r
221 && (
_node.nodeType() == XML_READER_TYPE_END_ELEMENT
222 || (
_node.nodeType() == XML_READER_TYPE_ELEMENT
223 &&
_node.isEmptyElement() ) ) )
Base class for Exception.
std::string basename() const
Return the last component of this path.
bool seekToEndNode(int depth_r, const std::string &name_r)
XmlString nodeText()
If the current node is not empty, advances the reader to the next node, and returns the value.
Reader(const InputStream &stream_r, const Validate &validate_r=Validate::none())
Ctor.
bool seekToNode(int depth_r, const std::string &name_r)
bool empty() const
Whether neither idents nor provides are set.
std::string stripSuffix(const C_Str &str_r, const C_Str &suffix_r)
Strip a suffix_r from str_r and return the resulting string.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Easy-to use interface to the ZYPP dependency resolver.
std::string asString(const Patch::Category &obj)
xmlTextReader document validation.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.