Simbody
|
Abstract handle for holding any kind of node in an XML tree. More...
#include <Xml.h>
Public Member Functions | |
bool | operator== (const Node &other) const |
Comparing Nodes for equality means asking if the two Node handles are referring to exactly the same object; two different nodes that happen to have the same properties will not test equal by this criteria. | |
bool | operator!= (const Node &other) const |
Inequality test using same criteria as operator==(). | |
Construction and destruction | |
These methods are mostly used by the derived node classes; Nodes are not generally created directly in user code. | |
Node () | |
Create an empty Node handle that can be used to hold a reference to any kind of Node. | |
Node (const Node &src) | |
Copy constructor is shallow; that is, this handle will refer to the same node as the source. | |
Node & | operator= (const Node &src) |
Copy assignment is shallow; the handle is first cleared and then will refer to the same node as the source. | |
Node | clone () const |
The clone() method makes a deep copy of this Node and its children and returns a new orphan Node with the same contents; ordinary assignment and copy construction is shallow. | |
~Node () | |
The Node handle destructor does not recover heap space so if you create orphan nodes and then don't put them in a document there will be a memory leak unless you explicitly destruct them first with clearOrphan(). | |
void | clear () |
This method restores the Node handle to its default-constructed state but does not recover any heap space; use clearOrphan() if you know this node was never put into a document. | |
void | clearOrphan () |
This method explictly frees the heap space for an orphan node that was created but never inserted into a document. | |
Node classification | |
You can find out what concrete type of node this abstract Node handle is referring to (if any), who owns the node, and if it is owned by a parent element you can get access to the parent. | |
NodeType | getNodeType () const |
Get the Xml::NodeType of this node. | |
String | getNodeTypeAsString () const |
Get the Node type as a string; an empty handle returns "NoNode". | |
bool | isValid () const |
Return true if this Node handle is referencing some node, false if the Node handle is empty. | |
bool | isTopLevelNode () const |
Return true if this Node is owned by the top-level Xml document, false if the Node is owned by an Element or is an orphan, or if the Node handle is empty. | |
bool | isOrphan () const |
Return true if this Node is an orphan, meaning that it is not empty, but is not owned by any element or top-level document. | |
bool | hasParentElement () const |
Return true if this node has a parent, i.e. | |
Element | getParentElement () |
Return a handle referencing this node's parent if it has one, otherwise throws an error; check first with hasParentElement() if you aren't sure. | |
Access to node contents | |
Usually contents inspection is handled at the concrete node class level; here we can only provide information for which you don't need to know what kind of node this is. | |
const String & | getNodeText () const |
Return a text value associated with this Node (not including its child nodes if any); the behavior depends on the NodeType. | |
void | writeToString (String &out, bool compact=false) const |
Serialize this node (and everything it contains) to the given String. | |
Friends | |
class | Xml |
class | Xml::Impl |
class | Xml::node_iterator |
class | Xml::Comment |
class | Xml::Unknown |
class | Xml::Text |
class | Xml::Element |
Related Functions | |
(Note that these are not member functions.) | |
std::ostream & | operator<< (std::ostream &o, const Xml::Node &xmlNode) |
Output a "pretty printed" textual representation of the given XML node (and all its contents) to an std::ostream. |
Abstract handle for holding any kind of node in an XML tree.
The concrete node handle types derived from Node are: Comment, Unknown, Text, and Element. Only an Element node may contain other nodes.
A node may be classified by who owns it. There are three possibilities:
A Node handle may also be empty, meaning it refers to no node at all so there is nothing to own.
Top-level nodes can only be Comment nodes, Unknown nodes, or the lone root Element node. Child nodes and orphans can be of Element and Text type also. Normally orphans exist only briefly during the time a new node is constructed and the time it is adopted by some element (usually in the same constructor) so you can ignore them for the most part. But if you must keep orphan nodes around, be aware that they must be referenced by only one handle at a time to avoid ownership conflicts.
SimTK::Xml::Node::Node | ( | ) | [inline] |
SimTK::Xml::Node::Node | ( | const Node & | src | ) | [inline] |
Copy constructor is shallow; that is, this handle will refer to the same node as the source.
Note that this handle will provide write access to the underlying node, even if the source was const.
SimTK::Xml::Node::~Node | ( | ) | [inline] |
The Node handle destructor does not recover heap space so if you create orphan nodes and then don't put them in a document there will be a memory leak unless you explicitly destruct them first with clearOrphan().
Copy assignment is shallow; the handle is first cleared and then will refer to the same node as the source.
Note that this handle will provide write access to the underlying node even if the source handle was const.
Node SimTK::Xml::Node::clone | ( | ) | const |
The clone() method makes a deep copy of this Node and its children and returns a new orphan Node with the same contents; ordinary assignment and copy construction is shallow.
Reimplemented in SimTK::Xml::Element, SimTK::Xml::Text, SimTK::Xml::Comment, and SimTK::Xml::Unknown.
void SimTK::Xml::Node::clear | ( | ) |
This method restores the Node handle to its default-constructed state but does not recover any heap space; use clearOrphan() if you know this node was never put into a document.
void SimTK::Xml::Node::clearOrphan | ( | ) |
This method explictly frees the heap space for an orphan node that was created but never inserted into a document.
It is an error to call this if the node is in a document.
NodeType SimTK::Xml::Node::getNodeType | ( | ) | const |
Get the Xml::NodeType of this node.
If this Node handle is empty, the returned NodeType will be "Xml::NoNode".
String SimTK::Xml::Node::getNodeTypeAsString | ( | ) | const |
Get the Node type as a string; an empty handle returns "NoNode".
bool SimTK::Xml::Node::isValid | ( | ) | const [inline] |
bool SimTK::Xml::Node::isTopLevelNode | ( | ) | const |
bool SimTK::Xml::Node::isOrphan | ( | ) | const |
bool SimTK::Xml::Node::hasParentElement | ( | ) | const |
Return true if this node has a parent, i.e.
it is owned by an element; the root element and other top-level nodes are owned by the document and thus do not have a parent.
Element SimTK::Xml::Node::getParentElement | ( | ) |
Return a handle referencing this node's parent if it has one, otherwise throws an error; check first with hasParentElement() if you aren't sure.
const String& SimTK::Xml::Node::getNodeText | ( | ) | const |
Return a text value associated with this Node (not including its child nodes if any); the behavior depends on the NodeType.
This is a convenience that saves downcasting a generic Node to a concrete type when all you want to do is dump out the text. It is not particularly useful for Element nodes. Here is what you get for each type of node:
void SimTK::Xml::Node::writeToString | ( | String & | out, |
bool | compact = false |
||
) | const |
Serialize this node (and everything it contains) to the given String.
The output will be "pretty printed" and terminated with a newline unless you specify compact = true in which case indents and newlines will be suppressed. Pretty printing uses the containing Xml::Document's indent string, if this Node is in a document, otherwise the default of four spaces for each indent level is used.
bool SimTK::Xml::Node::operator== | ( | const Node & | other | ) | const [inline] |
Comparing Nodes for equality means asking if the two Node handles are referring to exactly the same object; two different nodes that happen to have the same properties will not test equal by this criteria.
bool SimTK::Xml::Node::operator!= | ( | const Node & | other | ) | const [inline] |
Inequality test using same criteria as operator==().
friend class Xml [friend] |
friend class Xml::Impl [friend] |
friend class Xml::node_iterator [friend] |
friend class Xml::Comment [friend] |
friend class Xml::Unknown [friend] |
friend class Xml::Text [friend] |
friend class Xml::Element [friend] |
std::ostream & operator<< | ( | std::ostream & | o, |
const Xml::Node & | xmlNode | ||
) | [related] |
Output a "pretty printed" textual representation of the given XML node (and all its contents) to an std::ostream.
Pretty printing uses the indent string from the Node's containing Xml::Document, if this Node is in a document, otherwise the default of four spaces for each indent level is used.