|
- /*
- ==============================================================================
-
- This file is part of the JUCE library - "Jules' Utility Class Extensions"
- Copyright 2004-11 by Raw Material Software Ltd.
-
- ------------------------------------------------------------------------------
-
- JUCE can be redistributed and/or modified under the terms of the GNU General
- Public License (Version 2), as published by the Free Software Foundation.
- A copy of the license is included in the JUCE distribution, or can be found
- online at www.gnu.org/licenses.
-
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.rawmaterialsoftware.com/juce for more information.
-
- ==============================================================================
- */
-
- #ifndef __JUCE_XMLDOCUMENT_JUCEHEADER__
- #define __JUCE_XMLDOCUMENT_JUCEHEADER__
-
- #include "juce_XmlElement.h"
- #include "../text/juce_StringArray.h"
- #include "../files/juce_File.h"
- #include "../memory/juce_ScopedPointer.h"
- class InputSource;
-
-
- //==============================================================================
- /**
- Parses a text-based XML document and creates an XmlElement object from it.
-
- The parser will parse DTDs to load external entities but won't
- check the document for validity against the DTD.
-
- e.g.
- @code
-
- XmlDocument myDocument (File ("myfile.xml"));
- XmlElement* mainElement = myDocument.getDocumentElement();
-
- if (mainElement == nullptr)
- {
- String error = myDocument.getLastParseError();
- }
- else
- {
- ..use the element
- }
-
- @endcode
-
- Or you can use the static helper methods for quick parsing..
-
- @code
- XmlElement* xml = XmlDocument::parse (myXmlFile);
-
- if (xml != nullptr && xml->hasTagName ("foobar"))
- {
- ...etc
- @endcode
-
- @see XmlElement
- */
- class JUCE_API XmlDocument
- {
- public:
- //==============================================================================
- /** Creates an XmlDocument from the xml text.
- The text doesn't actually get parsed until the getDocumentElement() method is called.
- */
- XmlDocument (const String& documentText);
-
- /** Creates an XmlDocument from a file.
- The text doesn't actually get parsed until the getDocumentElement() method is called.
- */
- XmlDocument (const File& file);
-
- /** Destructor. */
- ~XmlDocument();
-
- //==============================================================================
- /** Creates an XmlElement object to represent the main document node.
-
- This method will do the actual parsing of the text, and if there's a
- parse error, it may returns 0 (and you can find out the error using
- the getLastParseError() method).
-
- See also the parse() methods, which provide a shorthand way to quickly
- parse a file or string.
-
- @param onlyReadOuterDocumentElement if true, the parser will only read the
- first section of the file, and will only
- return the outer document element - this
- allows quick checking of large files to
- see if they contain the correct type of
- tag, without having to parse the entire file
- @returns a new XmlElement which the caller will need to delete, or null if
- there was an error.
- @see getLastParseError
- */
- XmlElement* getDocumentElement (bool onlyReadOuterDocumentElement = false);
-
- /** Returns the parsing error that occurred the last time getDocumentElement was called.
-
- @returns the error, or an empty string if there was no error.
- */
- const String& getLastParseError() const noexcept;
-
- /** Sets an input source object to use for parsing documents that reference external entities.
-
- If the document has been created from a file, this probably won't be needed, but
- if you're parsing some text and there might be a DTD that references external
- files, you may need to create a custom input source that can retrieve the
- other files it needs.
-
- The object that is passed-in will be deleted automatically when no longer needed.
-
- @see InputSource
- */
- void setInputSource (InputSource* newSource) noexcept;
-
- /** Sets a flag to change the treatment of empty text elements.
-
- If this is true (the default state), then any text elements that contain only
- whitespace characters will be ingored during parsing. If you need to catch
- whitespace-only text, then you should set this to false before calling the
- getDocumentElement() method.
- */
- void setEmptyTextElementsIgnored (bool shouldBeIgnored) noexcept;
-
- //==============================================================================
- /** A handy static method that parses a file.
- This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it.
- @returns a new XmlElement which the caller will need to delete, or null if there was an error.
- */
- static XmlElement* parse (const File& file);
-
- /** A handy static method that parses some XML data.
- This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it.
- @returns a new XmlElement which the caller will need to delete, or null if there was an error.
- */
- static XmlElement* parse (const String& xmlData);
-
-
- //==============================================================================
- private:
- String originalText;
- String::CharPointerType input;
- bool outOfData, errorOccurred;
-
- String lastError, dtdText;
- StringArray tokenisedDTD;
- bool needToLoadDTD, ignoreEmptyTextElements;
- ScopedPointer <InputSource> inputSource;
-
- void setLastError (const String& desc, bool carryOn);
- void skipHeader();
- void skipNextWhiteSpace();
- juce_wchar readNextChar() noexcept;
- XmlElement* readNextElement (bool alsoParseSubElements);
- void readChildElements (XmlElement* parent);
- int findNextTokenLength() noexcept;
- void readQuotedString (String& result);
- void readEntity (String& result);
-
- String getFileContents (const String& filename) const;
- String expandEntity (const String& entity);
- String expandExternalEntity (const String& entity);
- String getParameterEntity (const String& entity);
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XmlDocument);
- };
-
-
- #endif // __JUCE_XMLDOCUMENT_JUCEHEADER__
|