Shapeworks Studio  2.1
Shape analysis software suite
List of all members | Public Member Functions
TiXmlHandle Class Reference

#include <tinyxml.h>

Public Member Functions

 TiXmlHandle (TiXmlNode *_node)
 Create a handle from any node (at any depth of the tree.) This can be a null pointer.
 
 TiXmlHandle (const TiXmlHandle &ref)
 Copy constructor.
 
TiXmlHandle operator= (const TiXmlHandle &ref)
 
TiXmlHandle FirstChild () const
 Return a handle to the first child node.
 
TiXmlHandle FirstChild (const char *value) const
 Return a handle to the first child node with the given name.
 
TiXmlHandle FirstChildElement () const
 Return a handle to the first child element.
 
TiXmlHandle FirstChildElement (const char *value) const
 Return a handle to the first child element with the given name.
 
TiXmlHandle Child (const char *value, int index) const
 
TiXmlHandle Child (int index) const
 
TiXmlHandle ChildElement (const char *value, int index) const
 
TiXmlHandle ChildElement (int index) const
 
TiXmlNodeToNode () const
 
TiXmlElementToElement () const
 
TiXmlTextToText () const
 
TiXmlUnknownToUnknown () const
 
TiXmlNodeNode () const
 
TiXmlElementElement () const
 
TiXmlTextText () const
 
TiXmlUnknownUnknown () const
 

Detailed Description

A TiXmlHandle is a class that wraps a node pointer with null checks; this is an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml DOM structure. It is a separate utility class.

Take an example:

<Document>
     <Element attributeA = "valueA">
          <Child attributeB = "value1" />
          <Child attributeB = "value2" />
     </Element>
<Document>

Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very easy to write a lot of code that looks like:

TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{
     TiXmlElement* element = root->FirstChildElement( "Element" );
     if ( element )
     {
          TiXmlElement* child = element->FirstChildElement( "Child" );
          if ( child )
          {
               TiXmlElement* child2 = child->NextSiblingElement( "Child" );
               if ( child2 )
               {
                    // Finally do something useful.

And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity of such code. A TiXmlHandle checks for null pointers so it is perfectly safe and correct to use:

TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{
     // do something useful

Which is MUCH more concise and useful.

It is also safe to copy handles - internally they are nothing more than node pointers.

TiXmlHandle handleCopy = handle;

What they should not be used for is iteration:

int i=0; 
while ( true )
{
     TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement();
     if ( !child )
          break;
     // do something
     ++i;
}

It seems reasonable, but it is in fact two embedded while loops. The Child method is a linear walk to find the element, so this code would iterate much more than it needs to. Instead, prefer:

TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement();

for( child; child; child=child->NextSiblingElement() )
{
     // do something
}

Definition at line 1638 of file tinyxml.h.

Member Function Documentation

TiXmlHandle TiXmlHandle::Child ( const char *  value,
int  index 
) const

Return a handle to the "index" child with the given name. The first child is 0, the second 1, etc.

Definition at line 1699 of file tinyxml.cpp.

1700 {
1701  if ( node )
1702  {
1703  int i;
1704  TiXmlNode* child = node->FirstChild( value );
1705  for ( i=0;
1706  child && i<count;
1707  child = child->NextSibling( value ), ++i )
1708  {
1709  // nothing
1710  }
1711  if ( child )
1712  return TiXmlHandle( child );
1713  }
1714  return TiXmlHandle( 0 );
1715 }
TiXmlHandle(TiXmlNode *_node)
Create a handle from any node (at any depth of the tree.) This can be a null pointer.
Definition: tinyxml.h:1642
const TiXmlNode * NextSibling() const
Navigate to a sibling node.
Definition: tinyxml.h:631
const TiXmlNode * FirstChild() const
The first child of this node. Will be null if there are no children.
Definition: tinyxml.h:522
TiXmlHandle TiXmlHandle::Child ( int  index) const

Return a handle to the "index" child. The first child is 0, the second 1, etc.

Definition at line 1680 of file tinyxml.cpp.

1681 {
1682  if ( node )
1683  {
1684  int i;
1685  TiXmlNode* child = node->FirstChild();
1686  for ( i=0;
1687  child && i<count;
1688  child = child->NextSibling(), ++i )
1689  {
1690  // nothing
1691  }
1692  if ( child )
1693  return TiXmlHandle( child );
1694  }
1695  return TiXmlHandle( 0 );
1696 }
TiXmlHandle(TiXmlNode *_node)
Create a handle from any node (at any depth of the tree.) This can be a null pointer.
Definition: tinyxml.h:1642
const TiXmlNode * NextSibling() const
Navigate to a sibling node.
Definition: tinyxml.h:631
const TiXmlNode * FirstChild() const
The first child of this node. Will be null if there are no children.
Definition: tinyxml.h:522
TiXmlHandle TiXmlHandle::ChildElement ( const char *  value,
int  index 
) const

Return a handle to the "index" child element with the given name. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted.

Definition at line 1737 of file tinyxml.cpp.

1738 {
1739  if ( node )
1740  {
1741  int i;
1742  TiXmlElement* child = node->FirstChildElement( value );
1743  for ( i=0;
1744  child && i<count;
1745  child = child->NextSiblingElement( value ), ++i )
1746  {
1747  // nothing
1748  }
1749  if ( child )
1750  return TiXmlHandle( child );
1751  }
1752  return TiXmlHandle( 0 );
1753 }
TiXmlHandle(TiXmlNode *_node)
Create a handle from any node (at any depth of the tree.) This can be a null pointer.
Definition: tinyxml.h:1642
const TiXmlElement * NextSiblingElement() const
Definition: tinyxml.cpp:482
const TiXmlElement * FirstChildElement() const
Convenience function to get through elements.
Definition: tinyxml.cpp:452
TiXmlHandle TiXmlHandle::ChildElement ( int  index) const

Return a handle to the "index" child element. The first child element is 0, the second 1, etc. Note that only TiXmlElements are indexed: other types are not counted.

Definition at line 1718 of file tinyxml.cpp.

1719 {
1720  if ( node )
1721  {
1722  int i;
1723  TiXmlElement* child = node->FirstChildElement();
1724  for ( i=0;
1725  child && i<count;
1726  child = child->NextSiblingElement(), ++i )
1727  {
1728  // nothing
1729  }
1730  if ( child )
1731  return TiXmlHandle( child );
1732  }
1733  return TiXmlHandle( 0 );
1734 }
TiXmlHandle(TiXmlNode *_node)
Create a handle from any node (at any depth of the tree.) This can be a null pointer.
Definition: tinyxml.h:1642
const TiXmlElement * NextSiblingElement() const
Definition: tinyxml.cpp:482
const TiXmlElement * FirstChildElement() const
Convenience function to get through elements.
Definition: tinyxml.cpp:452
TiXmlElement* TiXmlHandle::Element ( ) const
inline
Deprecated:
use ToElement. Return the handle as a TiXmlElement. This may return null.

Definition at line 1703 of file tinyxml.h.

1703 { return ToElement(); }
TiXmlElement * ToElement() const
Definition: tinyxml.h:1688
TiXmlNode* TiXmlHandle::Node ( ) const
inline
Deprecated:
use ToNode. Return the handle as a TiXmlNode. This may return null.

Definition at line 1699 of file tinyxml.h.

1699 { return ToNode(); }
TiXmlNode * ToNode() const
Definition: tinyxml.h:1685
TiXmlText* TiXmlHandle::Text ( ) const
inline
Deprecated:
use ToText() Return the handle as a TiXmlText. This may return null.

Definition at line 1707 of file tinyxml.h.

1707 { return ToText(); }
TiXmlText * ToText() const
Definition: tinyxml.h:1691
TiXmlElement* TiXmlHandle::ToElement ( ) const
inline

Return the handle as a TiXmlElement. This may return null.

Definition at line 1688 of file tinyxml.h.

1688 { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); }
virtual const TiXmlElement * ToElement() const
Cast to a more defined type. Will return null if not of the requested type.
Definition: tinyxml.h:698
TiXmlNode* TiXmlHandle::ToNode ( ) const
inline

Return the handle as a TiXmlNode. This may return null.

Definition at line 1685 of file tinyxml.h.

1685 { return node; }
TiXmlText* TiXmlHandle::ToText ( ) const
inline

Return the handle as a TiXmlText. This may return null.

Definition at line 1691 of file tinyxml.h.

1691 { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); }
virtual const TiXmlText * ToText() const
Cast to a more defined type. Will return null if not of the requested type.
Definition: tinyxml.h:701
TiXmlUnknown* TiXmlHandle::ToUnknown ( ) const
inline

Return the handle as a TiXmlUnknown. This may return null.

Definition at line 1694 of file tinyxml.h.

1694 { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); }
virtual const TiXmlUnknown * ToUnknown() const
Cast to a more defined type. Will return null if not of the requested type.
Definition: tinyxml.h:700
TiXmlUnknown* TiXmlHandle::Unknown ( ) const
inline
Deprecated:
use ToUnknown() Return the handle as a TiXmlUnknown. This may return null.

Definition at line 1711 of file tinyxml.h.

1711 { return ToUnknown(); }
TiXmlUnknown * ToUnknown() const
Definition: tinyxml.h:1694

The documentation for this class was generated from the following files: