📄 tinyxml.h
字号:
// Figure out what is at *p, and parse it. Returns null if it is not an xml node. TiXmlNode* Identify( const char* start ); void CopyToClone( TiXmlNode* target ) const { target->value = value; } TiXmlNode* parent; NodeType type; TiXmlNode* firstChild; TiXmlNode* lastChild; std::string value; TiXmlNode* prev; TiXmlNode* next;};/** An attribute is a name-value pair. Elements have an arbitrary number of attributes, each with a unique name. @note The attributes are not TiXmlNodes, since they are not part of the tinyXML document object model. There are other suggested ways to look at this problem. @note Attributes have a parent*/class TiXmlAttribute : public TiXmlBase{ friend class TiXmlAttributeSet; public: /// Construct an empty attribute. TiXmlAttribute() : prev( 0 ), next( 0 ) {} /// Construct an attribute with a name and value. TiXmlAttribute( const std::string& _name, const std::string& _value ) : name( _name ), value( _value ), prev( 0 ), next( 0 ) {} const std::string& Name() const { return name; } ///< Return the name of this attribute. const std::string& Value() const { return value; } ///< Return the value of this attribute. const int IntValue() const; ///< Return the value of this attribute, converted to an integer. const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. void SetName( const std::string& _name ) { name = _name; } ///< Set the name of this attribute. void SetValue( const std::string& _value ) { value = _value; } ///< Set the value. void SetIntValue( int value ); ///< Set the value from an integer. void SetDoubleValue( double value ); ///< Set the value from a double. /// Get the next sibling attribute in the DOM. Returns null at end. TiXmlAttribute* Next() const; /// Get the previous sibling attribute in the DOM. Returns null at beginning. TiXmlAttribute* Previous() const; bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } /* [internal use] Attribtue parsing starts: first letter of the name returns: the next char after the value end quote */ virtual const char* Parse( const char* p ); // [internal use] virtual void Print( FILE* cfile, int depth ) const; // [internal use] virtual void StreamOut( std::ostream* out ) const; // [internal use] // Set the document pointer so the attribute can report errors. void SetDocument( TiXmlDocument* doc ) { document = doc; } private: TiXmlDocument* document; // A pointer back to a document, for error reporting. std::string name; std::string value; TiXmlAttribute* prev; TiXmlAttribute* next;};/* A class used to manage a group of attributes. It is only used internally, both by the ELEMENT and the DECLARATION. The set can be changed transparent to the Element and Declaration classes that use it, but NOT transparent to the Attribute which has to implement a next() and previous() method. Which makes it a bit problematic and prevents the use of STL. This version is implemented with circular lists because: - I like circular lists - it demonstrates some independence from the (typical) doubly linked list.*/class TiXmlAttributeSet{ public: TiXmlAttributeSet(); ~TiXmlAttributeSet(); void Add( TiXmlAttribute* attribute ); void Remove( TiXmlAttribute* attribute ); TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } TiXmlAttribute* Find( const std::string& name ) const; private: TiXmlAttribute sentinel;};/** The element is a container class. It has a value, the element name, and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes.*/class TiXmlElement : public TiXmlNode{ public: /// Construct an element. TiXmlElement( const std::string& value ); virtual ~TiXmlElement(); /** Given an attribute name, attribute returns the value for the attribute of that name, or null if none exists. */ const std::string* Attribute( const std::string& name ) const; /** Given an attribute name, attribute returns the value for the attribute of that name, or null if none exists. */ const std::string* Attribute( const std::string& name, int* i ) const; /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const std::string& name, const std::string& value ); /** Sets an attribute of name to a given value. The attribute will be created if it does not exist, or changed if it does. */ void SetAttribute( const std::string& name, int value ); /** Deletes an attribute with the given name. */ void RemoveAttribute( const std::string& name ); TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. // [internal use] Creates a new Element and returs it. virtual TiXmlNode* Clone() const; // [internal use] virtual void Print( FILE* cfile, int depth ) const; // [internal use] virtual void StreamOut ( std::ostream* out ) const; // [internal use] virtual void StreamIn( std::istream* in, std::string* tag ); protected: /* [internal use] Attribtue parsing starts: next char past '<' returns: next char past '>' */ virtual const char* Parse( const char* p ); /* [internal use] Reads the "value" of the element -- another element, or text. This should terminate with the current end tag. */ const char* ReadValue( const char* in ); bool ReadValue( std::istream* in ); private: TiXmlAttributeSet attributeSet;};/** An XML comment.*/class TiXmlComment : public TiXmlNode{ public: /// Constructs an empty comment. TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} virtual ~TiXmlComment() {} // [internal use] Creates a new Element and returs it. virtual TiXmlNode* Clone() const; // [internal use] virtual void Print( FILE* cfile, int depth ) const; // [internal use] virtual void StreamOut ( std::ostream* out ) const; // [internal use] virtual void StreamIn( std::istream* in, std::string* tag ); protected: /* [internal use] Attribtue parsing starts: at the ! of the !-- returns: next char past '>' */ virtual const char* Parse( const char* p );};/** XML text. Contained in an element.*/class TiXmlText : public TiXmlNode{ public: TiXmlText( const std::string& initValue ) : TiXmlNode( TiXmlNode::TEXT ) { SetValue( initValue ); } virtual ~TiXmlText() {} // [internal use] Creates a new Element and returns it. virtual TiXmlNode* Clone() const; // [internal use] virtual void Print( FILE* cfile, int depth ) const; // [internal use] virtual void StreamOut ( std::ostream* out ) const; // [internal use] bool Blank() const; // returns true if all white space and new lines /* [internal use] Attribtue parsing starts: First char of the text returns: next char past '>' */ virtual const char* Parse( const char* p ); // [internal use] virtual void StreamIn( std::istream* in, std::string* tag );};/** In correct XML the declaration is the first entry in the file. @verbatim <?xml version="1.0" standalone="yes"?> @endverbatim TinyXml will happily read or write files without a declaration, however. There are 3 possible attributes to the declaration: version, encoding, and standalone. Note: In this version of the code, the attributes are handled as special cases, not generic attributes, simply because there can only be at most 3 and they are always the same.*/class TiXmlDeclaration : public TiXmlNode{ public: /// Construct an empty declaration. TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} /// Construct. TiXmlDeclaration( const std::string& version, const std::string& encoding, const std::string& standalone ); virtual ~TiXmlDeclaration() {} /// Version. Will return empty if none was found. const std::string& Version() const { return version; } /// Encoding. Will return empty if none was found. const std::string& Encoding() const { return encoding; } /// Is this a standalone document? const std::string& Standalone() const { return standalone; } // [internal use] Creates a new Element and returs it. virtual TiXmlNode* Clone() const; // [internal use] virtual void Print( FILE* cfile, int depth ) const; // [internal use] virtual void StreamOut ( std::ostream* out ) const; // [internal use] virtual void StreamIn( std::istream* in, std::string* tag ); protected: // [internal use] // Attribtue parsing starts: next char past '<' // returns: next char past '>' virtual const char* Parse( const char* p ); private: std::string version; std::string encoding; std::string standalone;};/** Any tag that tinyXml doesn't recognize is save as an unknown. It is a tag of text, but should not be modified. It will be written back to the XML, unchanged, when the file is saved.*/class TiXmlUnknown : public TiXmlNode{ public: TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} virtual ~TiXmlUnknown() {} // [internal use] virtual TiXmlNode* Clone() const; // [internal use] virtual void Print( FILE* cfile, int depth ) const; // [internal use] virtual void StreamOut ( std::ostream* out ) const; // [internal use] virtual void StreamIn( std::istream* in, std::string* tag ); protected: /* [internal use] Attribute parsing starts: First char of the text returns: next char past '>' */ virtual const char* Parse( const char* p );};/** Always the top level node. A document binds together all the XML pieces. It can be saved, loaded, and printed to the screen. The 'value' of a document node is the xml file name.*/class TiXmlDocument : public TiXmlNode{ public: /// Create an empty document, that has no name. TiXmlDocument(); /// Create a document with a name. The name of the document is also the filename of the xml. TiXmlDocument( const std::string& documentName ); virtual ~TiXmlDocument() {} /** Load a file using the current document value. Returns true if successful. Will delete any existing document data before loading. */ bool LoadFile(); /// Save a file using the current document value. Returns true if successful. bool SaveFile() const; /// Load a file using the given filename. Returns true if successful. bool LoadFile( const std::string& filename ); /// Save a file using the given filename. Returns true if successful. bool SaveFile( const std::string& filename ) const; /// Parse the given null terminated block of xml data. virtual const char* Parse( const char* p ); /** Get the root element -- the only top level element -- of the document. In well formed XML, there should only be one. TinyXml is tolerant of multiple elements at the document level. */ TiXmlElement* RootElement() const { return FirstChildElement(); } /// If, during parsing, a error occurs, Error will be set to true. bool Error() const { return error; } /// Contains a textual (english) description of the error if one occurs. const std::string& ErrorDesc() const { return errorDesc; } /** Generally, you probably want the error string ( ErrorDesc() ). But if you prefer the ErrorId, this function will fetch it. */ const int ErrorId() const { return errorId; } /// If you have handled the error, it can be reset with this call. void ClearError() { error = false; errorId = 0; errorDesc = ""; } /** Dump the document to standard out. */ void Print() const { Print( stdout, 0 ); } // [internal use] virtual void Print( FILE* cfile, int depth = 0 ) const; // [internal use] virtual void StreamOut ( std::ostream* out ) const; // [internal use] virtual TiXmlNode* Clone() const; // [internal use] void SetError( int err ) { assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); error = true; errorId = err; errorDesc = errorString[ errorId ]; } // [internal use] virtual void StreamIn( std::istream* in, std::string* tag ); protected: private: bool error; int errorId; std::string errorDesc;};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -