1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
ULib/include/ulib/xml/expat/xml_parser.h
stefanocasazza b5184ba45e sync
2018-07-27 18:11:02 +02:00

165 lines
3.8 KiB
C++

// ============================================================================
//
// = LIBRARY
// ULib - c++ library
//
// = FILENAME
// xml_parser.h - parser XML based on Expat
//
// = AUTHOR
// Stefano Casazza
//
// ============================================================================
#ifndef ULIB_XMLPARSER_H
#define ULIB_XMLPARSER_H 1
#include <ulib/string.h>
#include <expat.h>
/**
* @class UXMLParser
*
* @brief UXMLParser is a parser XML based on Expat (Expat is a stream-oriented parser)
*/
class U_EXPORT UXMLParser {
public:
// Check for memory error
U_MEMORY_TEST
// Allocator e Deallocator
U_MEMORY_ALLOCATOR
U_MEMORY_DEALLOCATOR
UXMLParser()
{
U_TRACE_CTOR(0, UXMLParser, "")
m_parser = U_NULLPTR;
}
virtual ~UXMLParser()
{
U_TRACE_DTOR(0, UXMLParser)
if (m_parser)
{
// Free memory used by the parser. Your application is responsible for freeing any memory associated with UserData.
XML_ParserFree(m_parser);
m_parser = U_NULLPTR;
}
}
// SERVICES
void initParser(bool ns = true, const char* charset = U_NULLPTR);
bool parse(const UString& data)
{
U_TRACE(0, "UXMLParser::parse(%V)", data.rep)
U_INTERNAL_ASSERT_POINTER(m_parser)
if (XML_Parse(m_parser, U_STRING_TO_PARAM(data), 1) != 0) U_RETURN(true);
U_RETURN(false);
}
const char* getErrorMessage()
{
U_TRACE_NO_PARAM(0, "UXMLParser::getErrorMessage()")
U_INTERNAL_ASSERT_POINTER(m_parser)
const char* result = XML_ErrorString(XML_GetErrorCode(m_parser));
U_RETURN(result);
}
// DEBUG
#if defined(U_STDCPP_ENABLE) && defined(DEBUG)
const char* dump(bool reset) const;
#endif
protected:
XML_ParserStruct* m_parser;
void* getParseBuffer(int size)
{
U_TRACE(0, "UXMLParser::getParseBuffer(%d)", size)
U_INTERNAL_ASSERT_POINTER(m_parser)
void* result = XML_GetBuffer(m_parser, size);
U_RETURN(result);
}
bool parseBuffer(int size)
{
U_TRACE(0, "UXMLParser::parseBuffer(%d)", size)
U_INTERNAL_ASSERT_POINTER(m_parser)
if (XML_ParseBuffer(m_parser, size, (size == 0)) != 0) U_RETURN(true);
U_RETURN(false);
}
// VIRTUAL METHOD
virtual void startNamespace(const XML_Char* prefix, const XML_Char* uri)
{
U_TRACE(0, "UXMLParser::startNamespace(%S,%S)", prefix, uri)
}
virtual void endNamespace(const XML_Char* prefix)
{
U_TRACE(0, "UXMLParser::endNamespace(%S)", prefix)
}
virtual void startElement(const XML_Char* name, const XML_Char** attrs)
{
U_TRACE(0, "UXMLParser::startElement(%S,%p)", name, attrs)
U_DUMP_ATTRS(attrs)
}
virtual void endElement(const XML_Char* name)
{
U_TRACE(0, "UXMLParser::endElement(%S)", name)
}
virtual void characterData(const XML_Char* str, int len)
{
U_TRACE(0, "UXMLParser::characterData(%.*S,%d)", len, str, len)
}
// the C based XML parser calls through to these methods which pass them on to the C++ interface
static void _startElement(void* userData, const XML_Char* name, const XML_Char** attrs)
{ ((UXMLParser*)userData)->startElement(name, attrs); }
static void _characterData(void* userData, const XML_Char* str, int len)
{ ((UXMLParser*)userData)->characterData(str, len); }
static void _endElement(void* userData, const XML_Char* name)
{ ((UXMLParser*)userData)->endElement(name); }
static void _startNamespace(void* userData, const XML_Char* prefix, const XML_Char* uri)
{ ((UXMLParser*)userData)->startNamespace(prefix, uri); }
static void _endNamespace(void* userData, const XML_Char* prefix) { ((UXMLParser*)userData)->endNamespace(prefix); }
private:
U_DISALLOW_COPY_AND_ASSIGN(UXMLParser)
};
#endif