1 #ifndef SimTK_SimTKCOMMON_XML_H_ 2 #define SimTK_SimTKCOMMON_XML_H_ 309 NoJunkNodes = ElementNode|TextNode,
310 JunkNodes = CommentNode|UnknownNode,
311 AnyNodes = NoJunkNodes|JunkNodes
363 void readFromFile(
const String& pathname);
368 void writeToFile(
const String& pathname)
const;
372 void readFromString(
const String& xmlDocument);
376 void readFromString(
const char* xmlDocument);
382 void writeToString(
String& xmlDocument,
bool compact =
false)
const;
387 void setIndentString(
const String& indent);
390 const String& getIndentString()
const;
395 static void setXmlCondenseWhiteSpace(
bool shouldCondense);
398 static bool isXmlWhiteSpaceCondensed();
426 const String& getRootTag()
const;
429 void setRootTag(
const String& tag);
438 void insertTopLevelNodeAfter (
const node_iterator& afterThis,
442 void insertTopLevelNodeBefore(
const node_iterator& beforeThis,
499 String getXmlVersion()
const;
502 String getXmlEncoding()
const;
508 bool getXmlIsStandalone()
const;
512 void setXmlVersion(
const String& version);
515 void setXmlEncoding(
const String& encoding);
520 void setXmlIsStandalone(
bool isStandalone);
528 const Impl& getImpl()
const {assert(impl);
return *impl;}
529 Impl& updImpl() {assert(impl);
return *impl;}
531 Xml& unconst()
const {
return *
const_cast<Xml*
>(
this);}
573 {
if (&src!=
this) {clear(); tiAttr=src.tiAttr;}
return *
this; }
584 bool isOrphan()
const;
586 const String& getName()
const;
589 const String& getValue()
const;
611 void writeToString(
String& out)
const;
624 explicit Attribute(TiXmlAttribute* attr) {tiAttr=attr;}
625 const TiXmlAttribute& getTiAttr()
const {assert(tiAttr);
return *tiAttr;}
626 TiXmlAttribute& updTiAttr() {assert(tiAttr);
return *tiAttr;}
632 void setTiAttrPtr(TiXmlAttribute* attr) {tiAttr=attr;}
633 const TiXmlAttribute* getTiAttrPtr()
const {
return tiAttr;}
634 TiXmlAttribute* updTiAttrPtr() {
return tiAttr;}
638 TiXmlAttribute* tiAttr;
660 :
public std::iterator<std::bidirectional_iterator_tag, Xml::Attribute> {
671 : attr(src->updTiAttrPtr()) {}
677 { attr.setTiAttrPtr(src->updTiAttrPtr());
return *
this; }
710 {
return other.attr==attr; }
713 {
return other.attr!=attr; }
772 {
if (&src!=
this) {clear(); tiNode=src.tiNode;}
return *
this; }
802 String getNodeTypeAsString()
const;
811 bool isTopLevelNode()
const;
817 bool isOrphan()
const;
822 bool hasParentElement()
const;
845 const String& getNodeText()
const;
853 void writeToString(
String& out,
bool compact=
false)
const;
867 explicit Node(TiXmlNode* tiNode) : tiNode(tiNode) {}
869 const TiXmlNode& getTiNode()
const {assert(tiNode);
return *tiNode;}
870 TiXmlNode& updTiNode() {assert(tiNode);
return *tiNode;}
875 void setTiNodePtr(TiXmlNode* node) {tiNode=node;}
876 const TiXmlNode* getTiNodePtr()
const {
return tiNode;}
877 TiXmlNode* updTiNodePtr() {
return tiNode;}
883 friend class Xml::Impl;
890 Node& unconst()
const {
return *
const_cast<Node*
>(
this);}
916 :
public std::iterator<std::bidirectional_iterator_tag, Xml::Node> {
920 : allowed(allowed) {}
922 : node(node), allowed(allowed) {}
927 : node(*src), allowed(src.allowed) {}
933 { node = *src; allowed = src.allowed;
return *
this; }
951 : node(tiNode), allowed(allowed) {}
953 { node.setTiNodePtr(tiNode); }
995 { upcast()=src; tag = src.tag;
return *
this; }
1002 inline Element* operator->()
const;
1005 {
return other.upcast()==upcast();}
1007 {
return other.upcast()!=upcast();}
1015 :
node_iterator((TiXmlNode*)tiElt, ElementNode), tag(tag) {}
1016 void reassign(TiXmlElement* tiElt)
1017 { upcast().
reassign((TiXmlNode*)tiElt); }
1091 const String& getElementTag()
const;
1093 void setElementTag(
const String& tag);
1138 bool isValueElement()
const;
1147 const String& getValue()
const;
1161 void setValue(
const String& value);
1168 { setValue(
String(value)); }
1177 { T out; convertStringTo(getValue(),out);
return out;}
1182 { convertStringTo(getValue(),out); }
1193 {
return unconst().getRequiredElement(tag).getValue(); }
1200 {
const Element opt(unconst().getOptionalElement(tag));
1211 template <
class T> T
1213 { T out; convertStringTo(unconst().getRequiredElementValue(tag), out);
1227 template <
class T> T
1229 {
const Element opt(unconst().getOptionalElement(tag));
1230 if (!opt.
isValid())
return def;
1231 T out; convertStringTo(opt.
getValue(), out);
return out; }
1241 bool hasAttribute(
const String& name)
const;
1245 void setAttributeValue(
const String& name,
const String& value);
1251 void eraseAttribute(
const String& name);
1257 {
return unconst().getRequiredAttribute(name).getValue(); }
1265 template <
class T> T
1267 { T out; convertStringTo(getRequiredAttributeValue(name),out);
return out; }
1277 {
Attribute attr = unconst().getOptionalAttribute(name);
1278 if (!attr.
isValid())
return def;
1291 template <
class T> T
1293 {
Attribute attr = unconst().getOptionalAttribute(name);
1294 if (!attr.
isValid())
return def;
1295 T out; convertStringTo(attr.
getValue(), out);
return out; }
1340 bool hasElement(
const String& tag)
const;
1343 bool hasNode(
NodeType allowed=AnyNodes)
const;
1373 {
return Array_<Node>(node_begin(allowed), node_end()); }
1399 static bool isA(
const Node&);
1413 explicit Element(TiXmlElement* tiElt)
1414 :
Node(reinterpret_cast<TiXmlNode*>(tiElt)) {}
1416 TiXmlElement& updTiElement()
1417 {
return reinterpret_cast<TiXmlElement&
>(updTiNode()); }
1418 const TiXmlElement& getTiElement()
const 1419 {
return reinterpret_cast<const TiXmlElement&
>(getTiNode()); }
1424 const TiXmlElement* getTiElementPtr()
const 1425 {
return reinterpret_cast<const TiXmlElement*
>(getTiNodePtr()); }
1426 TiXmlElement* updTiElementPtr()
1427 {
return reinterpret_cast<TiXmlElement*
>(updTiNodePtr()); }
1428 void setTiElementPtr(TiXmlElement* elt)
1429 { setTiNodePtr(reinterpret_cast<TiXmlNode*>(elt)); }
1445 {
return Element::getAs(*upcast());}
1447 {
return &Element::getAs(*upcast());}
1473 const String& getText()
const;
1483 static bool isA(
const Node&);
1486 static const Text& getAs(
const Node& node);
1496 explicit Text(TiXmlText* tiText)
1497 :
Node(reinterpret_cast<TiXmlNode*>(tiText)) {}
1528 static bool isA(
const Node&);
1541 explicit Comment(TiXmlComment* tiComment)
1542 :
Node(reinterpret_cast<TiXmlNode*>(tiComment)) {}
1568 {
new(
this)
Unknown(contents);
1578 const String& getContents()
const;
1581 void setContents(
const String& contents);
1588 static bool isA(
const Node&);
1601 explicit Unknown(TiXmlUnknown* tiUnknown)
1602 :
Node(reinterpret_cast<TiXmlNode*>(tiUnknown)) {}
1607 #endif // SimTK_SimTKCOMMON_XML_H_ Unknown()
Create an empty Unknown node handle, suitable only for holding references to other Unknown nodes...
Definition: Xml.h:1555
Attribute(const Attribute &src)
Copy constructor is shallow; that is, this handle will refer to the same attribute as the source...
Definition: Xml.h:567
node_iterator(TiXmlNode *tiNode, NodeType allowed=AnyNodes)
Definition: Xml.h:950
#define SimTK_SimTKCOMMON_EXPORT
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:218
const String & getRequiredElementValue(const String &tag) const
Get the text value of a child value element that must be present in this element. ...
Definition: Xml.h:1192
Attribute & operator*() const
Return a writable reference to the Attribute referenced by this iterator; the handle will be invalid ...
Definition: Xml.h:700
~Attribute()
The Attribute handle destructor does not recover heap space so if you create orphan attributes and th...
Definition: Xml.h:577
const String & getValue() const
Get the text value of this value element.
Element * operator->() const
Definition: Xml.h:1446
This is something we don't understand but can carry around.
Definition: Xml.h:1551
Array_< Attribute > getAllAttributes()
Return an array containing Attribute handles referencing all the attributes of this element...
Definition: Xml.h:1314
Apache License January AND DISTRIBUTION Definitions License shall mean the terms and conditions for and distribution as defined by Sections through of this document Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License Legal Entity shall mean the union of the acting entity and all other entities that control are controlled by or are under common control with that entity For the purposes of this definition control direct or to cause the direction or management of such whether by contract or including but not limited to software source documentation source
Definition: LICENSE.txt:26
Text()
Create an empty Text node handle, suitable only for holding references to other Text nodes...
Definition: Xml.h:1460
node_iterator & operator=(const node_iterator &src)
Copy assignment takes an node_iterator that can be const, but that still allows writing to the Node...
Definition: Xml.h:932
const String & getRequiredAttributeValue(const String &name) const
Get the value of an attribute as a string and throw an error if that attribute is not present...
Definition: Xml.h:1256
T getOptionalAttributeValueAs(const String &name, const T &def) const
Convert the value of an optional attribute, if present, from a string to the type of the template arg...
Definition: Xml.h:1292
Element(const String &tagWord, const T &value)
Create a new value element and set its initial value to the text equivalent of any type T for which a...
Definition: Xml.h:1081
T getOptionalElementValueAs(const String &tag, const T &def) const
Convert the text value of an optional child value element, if present, to the type of the template ar...
Definition: Xml.h:1228
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
Node()
Create an empty Node handle that can be used to hold a reference to any kind of Node.
Definition: Xml.h:762
node_iterator(NodeType allowed=AnyNodes)
Definition: Xml.h:919
String getOptionalAttributeValue(const String &name, const String &def="") const
Get the value of an attribute as a string if the attribute is present in this element, otherwise return a supplied default value.
Definition: Xml.h:1276
void reassign(TiXmlNode *tiNode)
Definition: Xml.h:952
node_iterator(const node_iterator &src)
Copy constructor takes a node_iterator that can be const, but that still allows writing to the Node...
Definition: Xml.h:926
~Node()
The Node handle destructor does not recover heap space so if you create orphan nodes and then don't p...
Definition: Xml.h:780
void getValueAs(T &out) const
Alternate form of getValueAs() that avoids unnecessary copying and heap allocation for reading in lar...
Definition: Xml.h:1181
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 s...
Definition: Xml.h:901
T getRequiredElementValueAs(const String &tag) const
Convert the text value of a required child value element to the type of the template argument T...
Definition: Xml.h:1212
Array_< Node > getAllNodes(NodeType allowed=AnyNodes)
Return an array containing Node handles referencing all the immediate child nodes contained in this e...
Definition: Xml.h:1372
Element & operator*() const
Definition: Xml.h:1444
bool isValid() const
Return true if this Node handle is referencing some node, false if the Node handle is empty...
Definition: Xml.h:806
bool operator==(const Node &other) const
Comparing Nodes for equality means asking if the two Node handles are referring to exactly the same o...
Definition: Xml.h:859
Node * operator->()
Definition: Xml.h:940
bool operator==(const Attribute &attr) const
Comparison operators return true if the same attribute is being referenced or both handles are empty...
Definition: Xml.h:616
attribute_iterator()
Default constructor creates an iterator that compares equal to attribute_end().
Definition: Xml.h:664
element_iterator & operator=(const element_iterator &src)
Copy assignment takes an element_iterator that can be const, but that still allows writing to the Ele...
Definition: Xml.h:994
bool isValid() const
Is this handle currently holding an attribute?
Definition: Xml.h:579
std::ostream & operator<<(std::ostream &o, const Xml::Document &doc)
Output a "pretty printed" textual representation of the given Xml::Document to an std::ostream...
Definition: Xml.h:541
element_iterator(const String &tag="")
This is the default constructor which leaves the element_iterator empty, and you can optionally set t...
Definition: Xml.h:981
This file defines the Array_<T,X> class and related support classes including base classes ArrayViewC...
bool operator!=(const element_iterator &other) const
Definition: Xml.h:1006
This is a bidirectional iterator suitable for moving forward or backward within a list of Attributes ...
Definition: Xml.h:659
Element()
Create an empty Element handle; this is suitable only for holding references to other Elements...
Definition: Xml.h:1059
This is the "leaf" content of an element.
Definition: Xml.h:1456
This class provides a minimalist capability for reading and writing XML documents, as files or strings.
Definition: Xml.h:269
void writeToString(String &xmlDocument, bool compact=false) const
Write the contents of this in-memory Xml::Document to the supplied string.
Node(const Node &src)
Copy constructor is shallow; that is, this handle will refer to the same node as the source...
Definition: Xml.h:766
Attribute & operator=(const Attribute &src)
Copy assignment is shallow; the handle is first cleared and then will refer to the same attribute as ...
Definition: Xml.h:572
node_iterator node_end() const
This node_end() iterator indicates the end of any sequence of nodes regardless of the NodeType restri...
An element has (1) a tagword, (2) a map of (name,value) pairs called attributes, and (3) a list of ch...
Definition: Xml.h:1046
Attribute()
Default constructor creates a null Attribute handle.
Definition: Xml.h:560
const String & getValue() const
If this is a valid attribute handle, get the value of the attribute as a String, not including the qu...
Matrix_< E > operator*(const MatrixBase< E > &l, const typename CNT< E >::StdNumber &r)
Definition: BigMatrix.h:605
The SimTK::Array_<T> container class is a plug-compatible replacement for the C++ standard template l...
Definition: Array.h:50
bool operator!=(const Attribute &attr) const
Definition: Xml.h:617
Attribute * operator->() const
Return a writable pointer to the Attribute referenced by this iterator; the pointer will never be nul...
Definition: Xml.h:704
~node_iterator()
An iterator destructor never deletes the object to which it refers.
Definition: Xml.h:929
void setValueAs(const T &value)
Set the value of this value element to the text equivalent of any type T for which a conversion const...
Definition: Xml.h:1167
NodeType
The NodeType enum serves as the actual type of a node and as a filter for allowable node types during...
Definition: Xml.h:302
Node * operator->() const
Definition: Xml.h:944
bool operator!=(const node_iterator &other) const
Definition: Xml.h:946
Node & operator*() const
Definition: Xml.h:943
bool operator!=(const attribute_iterator &other) const
Uses same criteria as operator==().
Definition: Xml.h:712
std::ostream & operator<<(std::ostream &o, const Xml::Attribute &attr)
Output a textual representation of the given Attribute to an std::ostream.
Definition: Xml.h:646
attribute_iterator & operator=(const attribute_iterator &src)
Copy assignment takes an attribute_iterator that can be const, but that still allows writing to the A...
Definition: Xml.h:676
Element node type and only-Elements filter.
Definition: Xml.h:304
Array_< Element > getAllElements(const String &tag="")
Return an array containing Element handles referencing all the immediate child elements contained in ...
Definition: Xml.h:1363
attribute_iterator(Attribute &attr)
Construct this iterator to point to the same attribute as does the supplied Attribute handle (or attr...
Definition: Xml.h:667
void writeToString(String &out, bool compact=false) const
Serialize this node (and everything it contains) to the given String.
element_iterator(const element_iterator &src)
Copy constructor takes an element_iterator that can be const, but that still allows writing to the El...
Definition: Xml.h:989
bool operator==(const node_iterator &other) const
Definition: Xml.h:945
SimTK::String is a plug-compatible std::string replacement (plus some additional functionality) inten...
Definition: String.h:62
This is a bidirectional iterator suitable for moving forward or backward within a list of Nodes...
Definition: Xml.h:915
node_iterator(Node &node, NodeType allowed=AnyNodes)
Definition: Xml.h:921
Mandatory first inclusion for any Simbody source or header file.
Unknown(Element &element, const String &contents)
Create a new Unknown node and append it to the list of nodes that are children of the given Element...
Definition: Xml.h:1567
Abstract handle for holding any kind of node in an XML tree.
Definition: Xml.h:752
bool operator==(const attribute_iterator &other) const
Comparison return true only if both iterators refer to the same in-memory attribute or both are at at...
Definition: Xml.h:709
Node & operator=(const Node &src)
Copy assignment is shallow; the handle is first cleared and then will refer to the same node as the s...
Definition: Xml.h:771
bool operator!=(const Node &other) const
Inequality test using same criteria as operator==().
Definition: Xml.h:861
bool operator==(const element_iterator &other) const
Definition: Xml.h:1004
String getOptionalElementValue(const String &tag, const String &def="") const
Get the text value of a child value element that may be present in this element, otherwise return a d...
Definition: Xml.h:1199
This is a bidirectional iterator suitable for moving forward or backward within a list of Element nod...
Definition: Xml.h:975
~attribute_iterator()
An iterator destructor never deletes the object to which it refers.
Definition: Xml.h:673
attribute_iterator(const attribute_iterator &src)
Copy constructor takes an attribute_iterator that can be const, but that still allows writing to the ...
Definition: Xml.h:670
Xml Document
This typedef allows Xml::Document to be used as the type of the document which is more conventional t...
Definition: Xml.h:278
Node & operator*()
Definition: Xml.h:939
Elements can have attributes, which are name="value" pairs that appear within the element start tag i...
Definition: Xml.h:557
T getRequiredAttributeValueAs(const String &name) const
Convert the text value of a required attribute to the type of the template argument T...
Definition: Xml.h:1266
void insertNodeBefore(const node_iterator &pos, Node node)
Insert a node into the list of this Element's children, just before the node pointed to by the suppli...
void writeToString(String &out) const
Serialize this attribute to the given String.
T getValueAs() const
Assuming this is a "value element", convert its text value to the type of the template argument T...
Definition: Xml.h:1176