diff --git a/interface/wx/xml/xml.h b/interface/wx/xml/xml.h index 114711e518..93ed2943fd 100644 --- a/interface/wx/xml/xml.h +++ b/interface/wx/xml/xml.h @@ -30,26 +30,41 @@ enum wxXmlNodeType Represents a node in an XML document. See wxXmlDocument. - Node has a name and may have content and attributes. + Each node is named and depending on the node type it may also hold content + or be given attributes. - Most common node types are @c wxXML_TEXT_NODE (name and attributes are irrelevant) - and @c wxXML_ELEMENT_NODE. + The two most common node types are @c wxXML_ELEMENT_NODE and + @c wxXML_TEXT_NODE. @c wxXML_ELEMENT_NODE represents a pair of XML element + tags, whilst @c wxXML_TEXT_NODE represents the text value that can belong + to the element. - Example: in \hi\ there is an element with the name - @c title and irrelevant content and one child of type @c wxXML_TEXT_NODE - with @c hi as content. + A @c wxXML_ELEMENT_NODE has a title, and optionally attributes, but does not + have any content. A @c wxXML_TEXT_NODE does not have a title or attributes + but should normally have content. - The @c wxXML_PI_NODE type sets the name to the PI target and the contents to + For example: in the XML fragment \hi\ there is an + element node with the name @c title and a single text node child with the + text @c hi as content. + + A @c wxXML_PI_NODE represents a Processing Instruction (PI) node with + the name parameter set as the target and the contents parameter set as the instructions. Note that whilst the PI instructions are often in the form - of pseudo-attributes these do not use the nodes attribute system. It is the users - responsibility to code and decode the instruction text. + of pseudo-attributes, these do not use the node's attribute member. It is + the user's responsibility to code and decode the PI instruction text. The @c wxXML_DOCUMENT_TYPE_NODE is not implemented at this time. Instead, - get and set the DOCTYPE values using the wxXmlDocument class. + you should get and set the DOCTYPE values using the wxXmlDocument class. If @c wxUSE_UNICODE is 0, all strings are encoded in the encoding given to wxXmlDocument::Load (default is UTF-8). + @Note + Once a wxXmlNode has been added to a wxXmlDocument it becomes owned by the + document and this has two implications. Firstly, the wxXmlDocument takes + responsibility for deleting the node so the user should not @c delete it; + and secondly, a wxXmlNode must always be created on the heap and never on + the stack. + @library{wxxml} @category{xml} @@ -59,14 +74,16 @@ class wxXmlNode { public: /** - Creates this XML node and eventually insert it into an existing XML tree. + Creates this XML node and inserts it into the XML tree as a child of + the specified parent. Once added, the XML tree takes ownership of this + object and there is no need to delete it. @param parent The parent node to which append this node instance. If this argument is @NULL this new node will be floating and it can be appended later to another one using the AddChild() or InsertChild() - functions. Otherwise the child is already added to the XML tree by - this constructor and it shouldn't be done again. + functions. Otherwise the child is added to the XML tree by this + constructor and it shouldn't be done again. @param type One of the ::wxXmlNodeType enumeration value. @param name @@ -130,7 +147,8 @@ public: virtual void AddAttribute(wxXmlAttribute* attr); /** - Adds node @a child as the last child of this node. + Adds node @a child as the last child of this node. Once added, the XML + tree takes ownership of this object and there is no need to delete it. @note Note that this function works in O(n) time where @e n is the number @@ -257,7 +275,8 @@ public: /** Inserts the @a child node immediately before @a followingNode in the - children list. + children list. Once inserted, the XML tree takes ownership of the new + child and there is no need to delete it. @return @true if @a followingNode has been found and the @a child node has been inserted. @@ -274,7 +293,8 @@ public: /** Inserts the @a child node immediately after @a precedingNode in the - children list. + children list. Once inserted, the XML tree takes ownership of the new + child and there is no need to delete it. @return @true if @a precedingNode has been found and the @a child node has been inserted. @@ -529,10 +549,10 @@ public: -//* special indentation value for wxXmlDocument::Save +//* Special indentation value for wxXmlDocument::Save. #define wxXML_NO_INDENTATION (-1) -//* flags for wxXmlDocument::Load +//* Flags for wxXmlDocument::Load. enum wxXmlDocumentLoadFlag { wxXMLDOC_NONE, @@ -549,6 +569,16 @@ enum wxXmlDocumentLoadFlag wxXmlDocument internally uses the expat library which comes with wxWidgets to parse the given stream. + A wxXmlDocument is in fact a list of wxXmlNode organised into a structure + that reflects the XML tree being represented by the document. + + @note + Ownership is passed to the XML tree as each wxXmlNode is added to it, + and this has two implications. Firstly, the wxXmlDocument takes + responsibility for deleting the node so the user should not @c delete it; + and secondly, a wxXmlNode must always be created on the heap and never + on the stack. + A simple example of using XML classes is: @code @@ -556,17 +586,19 @@ enum wxXmlDocumentLoadFlag if (!doc.Load("myfile.xml")) return false; - // start processing the XML file + // Start processing the XML file. if (doc.GetRoot()->GetName() != "myroot-node") return false; - // examine prologue + // Examine prologue. wxXmlNode *prolog = doc.GetDocumentNode()->GetChildren(); - while (prolog) { + while (prolog) + { - if (prolog->GetType() == wxXML_PI_NODE && prolog->GetName() == "target") { + if (prolog->GetType() == wxXML_PI_NODE && prolog->GetName() == "target") + { - // process Process Instruction contents + // Process Process Instruction (PI) contents. wxString pi = prolog->GetContent(); ... @@ -575,26 +607,27 @@ enum wxXmlDocumentLoadFlag } wxXmlNode *child = doc.GetRoot()->GetChildren(); - while (child) { - - if (child->GetName() == "tag1") { - - // process text enclosed by tag1/tag1 + while (child) + { + if (child->GetName() == "tag1") + { + // Process text enclosed by tag1/tag1. wxString content = child->GetNodeContent(); ... - // process attributes of tag1 + // Process attributes of tag1. wxString attrvalue1 = child->GetAttribute("attr1", "default-value"); wxString attrvalue2 = child->GetAttribute("attr2", "default-value"); ... + } + else if (child->GetName() == "tag2") + { - } else if (child->GetName() == "tag2") { - - // process tag2 ... + // Process tag2 ... } child = child->GetNext(); @@ -603,7 +636,7 @@ enum wxXmlDocumentLoadFlag Note that 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: + textnode removal and automatic indentation. For example: @code wxXmlDocument doc; @@ -622,6 +655,40 @@ enum wxXmlDocumentLoadFlag doc.Save("myfile2.xml"); // myfile2.xml != myfile.xml @endcode + wxXmlDocument can also be used to create documents. The following code gives + an example of creating a simple document with two nested element nodes, the + second of which has an attribute, and a text node. It also demonstrates + how to write the resulting output to a wxString: + + @code + // Create a document and add the root node. + wxXmlDocument xmlDoc; + + wxXmlNode* root = new wxXmlNode(NULL, wxXML_ELEMENT_NODE, "Root"); + xmlDoc.SetRoot(root); + + // Add some XML. + wxXmlNode* library = new wxXmlNode (root, wxXML_ELEMENT_NODE, "Library"); + library->AddAttribute("type", "CrossPlatformList"); + wxXmlNode* name = new wxXmlNode(library, wxXML_ELEMENT_NODE, "Name"); + name->AddChild(new wxXmlNode(wxXML_TEXT_NODE, "", "wxWidgets")); + + // Write the output to a wxString. + wxStringOutputStream stream; + xmlDoc.Save(stream); + @endcode + + This will produce a document that looks something like the following: + + @code + + + + wxWidgets + + + @endcode + If the root name value of the DOCTYPE is set, either by loading a file with a DOCTYPE declaration or by setting it directly with the SetDoctype member, then a DOCTYPE declaration will be added immediately after the XML declaration.