saxparser.h
来自「c语言编写的xml解析器可以方便的遍历插入删除节点等操作的」· C头文件 代码 · 共 190 行
H
190 行
/* saxparser.h * libxml++ and this file are copyright (C) 2000 by Ari Johnson, and * are covered by the GNU Lesser General Public License, which should be * included with libxml++ as the file COPYING. */#ifndef __LIBXMLPP_PARSERS_SAXPARSER_H#define __LIBXMLPP_PARSERS_SAXPARSER_H#include <libxml++/parsers/parser.h>#include <list>#include <deque>#include <memory>#include "libxml++/document.h"#ifndef DOXYGEN_SHOULD_SKIP_THISextern "C" { struct _xmlSAXHandler; struct _xmlEntity;};#endif //DOXYGEN_SHOULD_SKIP_THISnamespace xmlpp {/** SAX XML parser. * Derive your own class and override the on_*() methods. */class SaxParser : public Parser{public: /** * Simple structure used in the start_element callback, in which * the attributes are a list of name/value pairs. */ struct Attribute { std::string name; std::string value; Attribute(std::string const & name, std::string const & value) : name(name), value(value) { } }; typedef std::deque< Attribute > AttributeList; /** This functor is a helper to find an attribute by name in an * AttributeList using the standard algorithm std::find_if * * Example:@n * <code> * std::string name = "foo";@n * AttributeList::const_iterator attribute = std::find_if(attributes.begin(), attributes.end(), AttributeHasName(name)); * </code> */ struct AttributeHasName { std::string const & name; AttributeHasName(std::string const & name) : name(name) { } bool operator()(Attribute const & attribute) { return attribute.name == name; } }; /** * @param use_get_entity Set this to true if you will override on_get_entity(). * In theory, if you do not override on_get_entity() the parser should behave exactly the same * whether you use true or false here. But the default implementation of on_get_entity(), needed * if you override on_get_entity() might not have the same behaviour as the underlying default * behaviour of libxml, so the libxml implementation is the default here. */ SaxParser(bool use_get_entity = false); virtual ~SaxParser(); /** Parse an XML document from a file. * @throw exception * @param filename The path to the file. */ virtual void parse_file(const std::string& filename); /** Parse an XML document from a string. * @throw exception * @param contents The XML document as a string. */ virtual void parse_memory(const std::string& contents); /** Parse an XML document from a stream. * @throw exception * @param in The stream. */ virtual void parse_stream(std::istream& in); /** Parse a chunk of data. * * This lets you pass a document in small chunks, e.g. from a network * connection. The on_* virtual functions are called each time the chunks * provide enough information to advance the parser. * * The first call to parse_chunk will setup the parser. When the last chunk * has been parsed, call finish_chunk_parsing() to finish the parse. * * @throw exception * @param chunk The next piece of the XML document. */ virtual void parse_chunk(const std::string& chunk); /** Finish a chunk-wise parse. * * Call this after the last call to parse_chunk(). Don't use this function with * the other parsing methods. */ virtual void finish_chunk_parsing();protected: virtual void on_start_document(); virtual void on_end_document(); virtual void on_start_element(const std::string& name, const AttributeList& attributes); virtual void on_end_element(const std::string& name); virtual void on_characters(const std::string& characters); virtual void on_comment(const std::string& text); virtual void on_warning(const std::string& text); virtual void on_error(const std::string& text); virtual void on_fatal_error(const std::string& text); virtual void on_cdata_block(const std::string& text); /** Override this to receive information about the document's DTD and any entity declarations. */ virtual void on_internal_subset(const std::string& name, const std::string& publicId, const std::string& systemId); /** Override this method to resolve entities references in your derived parser, instead of using the default entity resolution, * or to be informed when entity references are encountered. * * If you override this function then you must also specify true for use_get_entity constructor parameter. * You will probably need to override on_entity_declaration() as well so that you can use that information when * resolving the entity reference. * * This is known to be difficult, because it requires both an understanding of the W3C specifications and knowledge of the * libxml internals. Entity resolution is easier with the DomParser. * * Call this method in this base class for default processing. For instance, if you just want to know about the existence of * an entity reference, without affecting the normal substitution, just override and call the base class. * * Unlike the DomParser, the SaxParser will also tell you about entity references for the 5 predefined entities. * * @param name The entity reference name. * @returns The resolved xmlEntity for the entity reference. You must include libxml/parser.h in order to use this C struct. * This instance will not be freed by the caller. */ virtual _xmlEntity* on_get_entity(const std::string& name); /** Override this to receive information about every entity declaration. * If you override this function, and you want normal entity substitution to work, then you must call the base class in your override. * * This would be useful when overriding on_get_entity(). */ virtual void on_entity_declaration(const std::string& name, XmlEntityType type, const std::string& publicId, const std::string& systemId, const std::string& content); virtual void release_underlying(); private: virtual void parse(); std::auto_ptr<_xmlSAXHandler> sax_handler_; // A separate xmlpp::Document that is just used for entity resolution, // and never seen in the API: xmlpp::Document entity_resolver_doc_; friend struct SaxParserCallback;};} // namespace xmlpp#endif //__LIBXMLPP_PARSERS_SAXPARSER_H
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?