+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Name: xmlnode.tex
+%% Purpose: wxXmlDocument documentation
+%% Author: Francesco Montorsi
+%% Created: 2006-04-18
+%% RCS-ID: $Id$
+%% Copyright: (c) 2006 Francesco Montorsi
+%% License: wxWindows license
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
\section{\class{wxXmlDocument}}\label{wxxmldocument}
This class holds XML data/document as parsed by XML parser in the root node.
wxXmlDocument internally uses the expat library which comes with wxWidgets to parse the given stream.
+A simple example of using XML classes is:
+
+\begin{verbatim}
+wxXmlDocument doc;
+if (!doc.Load(wxT("myfile.xml")))
+ return false;
+
+// start processing the XML file
+if (doc.GetRoot()->GetName() != wxT("myroot-node"))
+ return false;
+
+wxXmlNode *child = doc.GetRoot()->GetChildren();
+while (child) {
+
+ if (child->GetName() == wxT("tag1")) {
+
+ // process text enclosed by <tag1></tag1>
+ wxString content = child->GetNodeContent();
+
+ ...
+
+
+ // process properties of <tag1>
+ wxString propvalue1 = child->GetPropVal(wxT("prop1"), wxT("default-value"));
+ wxString propvalue2 = child->GetPropVal(wxT("prop2"), wxT("default-value"));
+
+ ...
+
+ } else if (child->GetName() == wxT("tag2")) {
+
+ // process tag2 ...
+ }
+
+ child = child->GetNext();
+}
+\end{verbatim}
+
+{\bf Note:} if you want to preserve the original formatting of the loaded file including whitespaces
+and indentation, you need to turn off whitespace-only textnode removal and automatic indentation:
+
+\begin{verbatim}
+wxXmlDocument doc;
+doc.Load(wxT("myfile.xml"), wxT("UTF-8"), wxXMLDOC_KEEP_WHITESPACE_NODES);
+doc.Save(wxT("myfile2.xml"), wxXML_NO_INDENTATION); // myfile2.xml will be indentic to myfile.xml
+\end{verbatim}
+
+Using default parameters, you will get a reformatted document which in general is different from
+the original loaded content:
+
+\begin{verbatim}
+wxXmlDocument doc;
+doc.Load(wxT("myfile.xml"));
+doc.Save(wxT("myfile2.xml")); // myfile2.xml != myfile.xml
+\end{verbatim}
+
+
\wxheading{Derived from}
\helpref{wxObject}{wxobject}
\func{}{wxXmlDocument}{\void}
-\func{}{wxXmlDocument}{\param{const wxString\& }{filename}, \param{const wxString\& }{encoding = wxT("UTF-8")}}
+\func{}{wxXmlDocument}{\param{const wxString\& }{filename}, \param{const wxString\& }{encoding = wxT("UTF-8")}, \param{int }{flags = wxXMLDOC\_NONE}}
Loads the given {\it filename} using the given encoding. See \helpref{Load()}{wxxmldocumentload}.
-\func{}{wxXmlDocument}{\param{wxInputStream\& }{stream}, \param{const wxString\& }{encoding = wxT("UTF-8")}}
+\func{}{wxXmlDocument}{\param{wxInputStream\& }{stream}, \param{const wxString\& }{encoding = wxT("UTF-8")}, \param{int }{flags = wxXMLDOC\_NONE}}
Loads the XML document from given stream using the given encoding. See \helpref{Load()}{wxxmldocumentload}.
Virtual destructor. Frees the document root node.
+
+\membersection{wxXmlDocument::DetachRoot}\label{wxxmldocumentdetachroot}
+
+\func{wxXmlNode*}{DetachRoot}{\void}
+
+Detaches the document root node and returns it. The document root node will be set to \NULL
+and thus \helpref{IsOk}{wxxmldocumentisok} will return \false after calling this function.
+
+Note that the caller is reponsible for deleting the returned node in order to avoid memory leaks.
+
+
\membersection{wxXmlDocument::GetEncoding}\label{wxxmldocumentgetencoding}
\constfunc{wxString}{GetEncoding}{\void}
\membersection{wxXmlDocument::Load}\label{wxxmldocumentload}
-\func{bool}{Load}{\param{const wxString\& }{filename}, \param{const wxString\& }{encoding = wxT("UTF-8")}}
+\func{bool}{Load}{\param{const wxString\& }{filename}, \param{const wxString\& }{encoding = wxT("UTF-8")}, \param{int }{flags = wxXMLDOC\_NONE}}
-Parses {\it filename} as an xml document and loads data. Returns \true on success, \false otherwise.
+Parses {\it filename} as an xml document and loads its data.
-\func{bool}{Load}{\param{wxInputStream\& }{stream}, \param{const wxString\& }{encoding = wxT("UTF-8")}}
+If {\tt flags} does not contain {\tt wxXMLDOC\_KEEP\_WHITESPACE\_NODES}, then, while loading, all nodes of
+type {\tt wxXML\_TEXT\_NODE} (see \helpref{wxXmlNode}{wxxmlnode}) are automatically skipped if they
+contain whitespaces only.
+The removal of these nodes makes the load process slightly faster and requires less memory however
+makes impossible to recreate exactly the loaded text with a \helpref{Save}{wxxmldocumentsave} call later.
+Read the initial description of this class for more info.
+
+Returns \true on success, \false otherwise.
+
+\func{bool}{Load}{\param{wxInputStream\& }{stream}, \param{const wxString\& }{encoding = wxT("UTF-8")}, \param{int }{flags = wxXMLDOC\_NONE}}
Like above but takes the data from given input stream.
\membersection{wxXmlDocument::Save}\label{wxxmldocumentsave}
-\constfunc{bool}{Save}{\param{const wxString\& }{filename}}
+\constfunc{bool}{Save}{\param{const wxString\& }{filename}, \param{int }{indentstep = 1}}
Saves XML tree creating a file named with given string.
-\constfunc{bool}{Save}{\param{wxOutputStream\& }{stream}}
+If {\tt indentstep} is greater than or equal to zero, then, while saving, an automatic indentation
+is added with steps composed by {\tt indentstep} spaces.
+If {\tt indentstep} is {\tt wxXML\_NO\_INDENTATION}, then, automatic indentation is turned off.
+
+\constfunc{bool}{Save}{\param{wxOutputStream\& }{stream}, \param{int }{indentstep = 1}}
-Saves XML tree in the given output stream.
+Saves XML tree in the given output stream. See other overload for a description of {\tt indentstep}.
\membersection{wxXmlDocument::SetEncoding}\label{wxxmldocumentsetencoding}
\func{void}{SetRoot}{\param{wxXmlNode* }{node}}
Sets the root node of this document. Deletes previous root node.
+Use \helpref{DetachRoot}{wxxmlnodedetachroot} and then SetRoot if you want to
+replace the root node without deleting the old document tree.
\membersection{wxXmlDocument::SetVersion}\label{wxxmldocumentsetversion}