ReactOS  0.4.12-dev-36-g472787f
XMLStorage::XMLNode Struct Reference

in memory representation of an XML node More...

#include <xmlstorage.h>

Inheritance diagram for XMLStorage::XMLNode:
Collaboration diagram for XMLStorage::XMLNode:

Classes

struct  AttributeMap
 map of XML node attributes More...
 
struct  Children
 internal children node list More...
 

Public Types

enum  COPY_FLAGS { COPY_NOCHILDREN }
 
- Public Types inherited from XMLStorage::XS_String
typedef std::string super
 

Public Member Functions

 XMLNode (const XS_String &name)
 
 XMLNode (const XS_String &name, const std::string &leading)
 
 XMLNode (const XMLNode &other)
 
 XMLNode (const XMLNode &other, COPY_FLAGS copy_no_children)
 
virtual ~XMLNode ()
 
void clear ()
 
XMLNodeoperator= (const XMLNode &other)
 
void add_child (XMLNode *child)
 add a new child node More...
 
void remove_children (const XS_String &name)
 remove all children named 'name' More...
 
void put (const XS_String &attr_name, const XS_String &value)
 write access to an attribute More...
 
XS_Stringoperator[] (const XS_String &attr_name)
 index operator write access to an attribute More...
 
template<typename T >
XS_String get (const T &attr_name, LPCXSSTR def=XS_EMPTY_STR) const
 read only access to an attribute More...
 
void erase (const XS_String &attr_name)
 remove the attribute 'attr_name' More...
 
XS_String subvalue (const XS_String &child_name, const XS_String &attr_name, int n=0) const
 convenient value access in children node More...
 
XS_Stringsubvalue (const XS_String &child_name, const XS_String &attr_name, int n=0)
 convenient storage of distinct values in children node More...
 
const Childrenget_children () const
 
Childrenget_children ()
 
const AttributeMapget_attributes () const
 
AttributeMapget_attributes ()
 
XS_String get_content () const
 read element node content More...
 
XS_String get_sub_content (const XPath &xpath) const
 read content of a subnode specified by an XPath expression More...
 
void set_content (const XS_String &s, bool cdata=false)
 set element node content More...
 
bool set_sub_content (const XPath &xpath, const XS_String &s, bool cdata=false)
 set content of a subnode specified by an XPath expression More...
 
bool write (std::ostream &out, const XMLFormat &format, WRITE_MODE mode=FORMAT_SMART, int indent=0) const
 write node with children tree to output stream More...
 
int count (const XPath &xpath) const
 count the nodes matching the given relative XPath expression More...
 
int count (XPath::const_iterator from, const XPath::const_iterator &to) const
 count the nodes matching the given relative XPath expression More...
 
bool filter (const XPath &xpath, XMLNode &target) const
 copy matching tree nodes using the given XPath filter expression More...
 
const XMLNodefind_relative (const XPath &xpath) const
 XPath find function (const) More...
 
XMLNodefind_relative (const XPath &xpath)
 XPath find function. More...
 
XMLNodeget_first_child () const
 
- Public Member Functions inherited from XMLStorage::XS_String
 XS_String ()
 
 XS_String (LPCXSSTR s)
 
 XS_String (LPCXSSTR s, size_t l)
 
 XS_String (const super &other)
 
 XS_String (const XS_String &other)
 
void assign (const XS_String &s)
 
XS_Stringoperator= (LPCXSSTR s)
 
XS_Stringoperator= (const super &s)
 
void assign (LPCXSSTR s)
 
void assign (LPCXSSTR s, size_t l)
 
 operator LPCXSSTR () const
 
XS_Stringprintf (LPCXSSTR fmt,...)
 
XS_Stringvprintf (LPCXSSTR fmt, va_list l)
 
XS_Stringappendf (LPCXSSTR fmt,...)
 
XS_Stringvappendf (LPCXSSTR fmt, va_list l)
 

Protected Member Functions

XMLNodecreate_relative (const XPath &xpath)
 relative XPath create function More...
 
XMLNodefilter (XPath::const_iterator from, const XPath::const_iterator &to) const
 create a new node tree using the given XPath filter expression More...
 
void original_write_worker (std::ostream &out) const
 write node with children tree to output stream using original white space More...
 
void plain_write_worker (std::ostream &out) const
 print node without any white space More...
 
void pretty_write_worker (std::ostream &out, const XMLFormat &format, int indent) const
 pretty print node with children tree to output stream More...
 
void smart_write_worker (std::ostream &out, const XMLFormat &format, int indent) const
 write node with children tree to output stream using smart formating More...
 

Protected Attributes

Children _children
 
AttributeMap _attributes
 
std::string _leading
 
std::string _content
 
std::string _end_leading
 
std::string _trailing
 
bool _cdata_content
 

Friends

struct XMLPos
 
struct const_XMLPos
 
struct XMLReaderBase
 
struct XPathElement
 

Detailed Description

in memory representation of an XML node

Definition at line 854 of file xmlstorage.h.

Member Enumeration Documentation

◆ COPY_FLAGS

Enumerator
COPY_NOCHILDREN 

Definition at line 1013 of file xmlstorage.h.

Constructor & Destructor Documentation

◆ XMLNode() [1/4]

XMLStorage::XMLNode::XMLNode ( const XS_String name)
inline

Definition at line 984 of file xmlstorage.h.

985  : XS_String(name),
986  _cdata_content(false)
987  {
988  }
Definition: name.c:36

◆ XMLNode() [2/4]

XMLStorage::XMLNode::XMLNode ( const XS_String name,
const std::string leading 
)
inline

Definition at line 990 of file xmlstorage.h.

991  : XS_String(name),
992  _leading(leading),
993  _cdata_content(false)
994  {
995  }
std::string _leading
Definition: xmlstorage.h:1273
Definition: name.c:36

◆ XMLNode() [3/4]

XMLStorage::XMLNode::XMLNode ( const XMLNode other)
inline

Definition at line 997 of file xmlstorage.h.

998  : XS_String(other),
999  _attributes(other._attributes),
1000  _leading(other._leading),
1001  _content(other._content),
1002  _end_leading(other._end_leading),
1003  _trailing(other._trailing),
1004 #ifdef XMLNODE_LOCATION
1005  _location(other._location),
1006 #endif
1007  _cdata_content(false)
1008  {
1009  for(Children::const_iterator it=other._children.begin(); it!=other._children.end(); ++it)
1010  _children.push_back(new XMLNode(**it));
1011  }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
int other
Definition: msacm.c:1364
AttributeMap _attributes
Definition: xmlstorage.h:1271
std::string _content
Definition: xmlstorage.h:1274
std::string _leading
Definition: xmlstorage.h:1273
std::string _end_leading
Definition: xmlstorage.h:1275
std::string _trailing
Definition: xmlstorage.h:1276

◆ XMLNode() [4/4]

XMLStorage::XMLNode::XMLNode ( const XMLNode other,
COPY_FLAGS  copy_no_children 
)
inline

Definition at line 1015 of file xmlstorage.h.

1016  : XS_String(other),
1017  _attributes(other._attributes),
1018  _leading(other._leading),
1019  _content(other._content),
1020  _end_leading(other._end_leading),
1021  _trailing(other._trailing),
1022 #ifdef XMLNODE_LOCATION
1023  _location(other._location),
1024 #endif
1025  _cdata_content(false)
1026  {
1027 // assert(copy_no_children==COPY_NOCHILDREN);
1028  }
int other
Definition: msacm.c:1364
AttributeMap _attributes
Definition: xmlstorage.h:1271
std::string _content
Definition: xmlstorage.h:1274
std::string _leading
Definition: xmlstorage.h:1273
std::string _end_leading
Definition: xmlstorage.h:1275
std::string _trailing
Definition: xmlstorage.h:1276

◆ ~XMLNode()

virtual XMLStorage::XMLNode::~XMLNode ( )
inlinevirtual

Definition at line 1030 of file xmlstorage.h.

1031  {
1032  while(!_children.empty()) {
1033  delete _children.back();
1034  _children.pop_back();
1035  }
1036  }

Member Function Documentation

◆ add_child()

void XMLStorage::XMLNode::add_child ( XMLNode child)
inline

add a new child node

Definition at line 1067 of file xmlstorage.h.

Referenced by create_relative(), and filter().

1068  {
1069  _children.push_back(child);
1070  }
static HWND child
Definition: cursoricon.c:298

◆ clear()

void XMLStorage::XMLNode::clear ( void  )
inline

Definition at line 1038 of file xmlstorage.h.

Referenced by XMLStorage::XMLNode::Children::clear(), and operator=().

1039  {
1040  _leading.erase();
1041  _content.erase();
1042  _end_leading.erase();
1043  _trailing.erase();
1044 
1045  _attributes.clear();
1046  _children.clear();
1047 
1048  XS_String::erase();
1049  }
AttributeMap _attributes
Definition: xmlstorage.h:1271
std::string _content
Definition: xmlstorage.h:1274
std::string _leading
Definition: xmlstorage.h:1273
std::string _end_leading
Definition: xmlstorage.h:1275
std::string _trailing
Definition: xmlstorage.h:1276

◆ count() [1/2]

int XMLStorage::XMLNode::count ( const XPath xpath) const
inline

count the nodes matching the given relative XPath expression

Definition at line 1244 of file xmlstorage.h.

1245  {
1246  return count(xpath.begin(), xpath.end());
1247  }
int count(const XPath &xpath) const
count the nodes matching the given relative XPath expression
Definition: xmlstorage.h:1244

◆ count() [2/2]

int XMLStorage::XMLNode::count ( XPath::const_iterator  from,
const XPath::const_iterator &  to 
) const

count the nodes matching the given relative XPath expression

Definition at line 301 of file xmlstorage.cpp.

302 {
303  const XPathElement& elem = *from++;
304  int cnt = 0;
305  int n = 0;
306 
307  for(XMLNode::Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
308  if (elem.matches(**it, n)) {
309  if (from != to)
310  // iterate deeper
311  cnt += (*it)->count(from, to);
312  else
313  // increment match counter
314  ++cnt;
315  }
316 
317  return cnt;
318 }
GLuint n
Definition: s_context.h:57
friend struct XPathElement
Definition: xmlstorage.h:982
static size_t elem
Definition: string.c:68
CardRegion * from
Definition: spigame.cpp:19

◆ create_relative()

XMLNode * XMLStorage::XMLNode::create_relative ( const XPath xpath)
protected

relative XPath create function

Definition at line 279 of file xmlstorage.cpp.

280 {
281  XMLNode* node = this;
282 
283  for(XPath::const_iterator it=xpath.begin(); it!=xpath.end(); ++it) {
284  XMLNode* child = it->find(node);
285 
286  if (!child) {
287  child = new XMLNode(it->_child_name);
288  node->add_child(child);
289 
290  if (!it->_attr_name.empty())
291  (*this)[it->_attr_name] = it->_attr_value;
292  }
293 
294  node = child;
295  }
296 
297  return node;
298 }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
Definition: graphics.c:170
static HWND child
Definition: cursoricon.c:298
struct node node

◆ erase()

void XMLStorage::XMLNode::erase ( const XS_String attr_name)
inline

remove the attribute 'attr_name'

Definition at line 1106 of file xmlstorage.h.

1107  {
1108  _attributes.erase(attr_name);
1109  }
AttributeMap _attributes
Definition: xmlstorage.h:1271

◆ filter() [1/2]

bool XMLStorage::XMLNode::filter ( const XPath xpath,
XMLNode target 
) const

copy matching tree nodes using the given XPath filter expression

Definition at line 321 of file xmlstorage.cpp.

322 {
323  XMLNode* ret = filter(xpath.begin(), xpath.end());
324 
325  if (ret) {
326  // move returned nodes to target node
327  target._children.move(ret->_children);
328  target._attributes = ret->_attributes;
329 
330  delete ret;
331 
332  return true;
333  } else
334  return false;
335 }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
int ret
bool filter(const XPath &xpath, XMLNode &target) const
copy matching tree nodes using the given XPath filter expression
Definition: xmlstorage.cpp:321

◆ filter() [2/2]

XMLNode * XMLStorage::XMLNode::filter ( XPath::const_iterator  from,
const XPath::const_iterator &  to 
) const
protected

create a new node tree using the given XPath filter expression

Definition at line 338 of file xmlstorage.cpp.

339 {
340  XMLNode* copy = NULL;
341 
342  const XPathElement& elem = *from++;
343  int cnt = 0;
344  int n = 0;
345 
346  for(XMLNode::Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
347  if (elem.matches(**it, n)) {
348  if (!copy)
349  copy = new XMLNode(*this, XMLNode::COPY_NOCHILDREN);
350 
351  if (from != to) {
352  XMLNode* ret = (*it)->filter(from, to);
353 
354  if (ret) {
355  copy->add_child(ret);
356  ++cnt;
357  }
358  } else {
359  copy->add_child(new XMLNode(**it, XMLNode::COPY_NOCHILDREN));
360  ++cnt;
361  }
362  }
363 
364  if (cnt > 0) {
365  return copy;
366  } else {
367  delete copy;
368  return NULL;
369  }
370 }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
GLuint n
Definition: s_context.h:57
friend struct XPathElement
Definition: xmlstorage.h:982
static size_t elem
Definition: string.c:68
smooth NULL
Definition: ftsmooth.c:416
int ret
INT copy(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
Definition: copy.c:51
CardRegion * from
Definition: spigame.cpp:19

◆ find_relative() [1/2]

const XMLNode * XMLStorage::XMLNode::find_relative ( const XPath xpath) const

XPath find function (const)

Definition at line 251 of file xmlstorage.cpp.

Referenced by XMLStorage::XMLPos::go(), and XMLStorage::const_XMLPos::go().

252 {
253  const XMLNode* node = this;
254 
255  for(XPath::const_iterator it=xpath.begin(); it!=xpath.end(); ++it) {
256  node = it->const_find(node);
257 
258  if (!node)
259  return NULL;
260  }
261 
262  return node;
263 }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
Definition: graphics.c:170
struct node node
smooth NULL
Definition: ftsmooth.c:416

◆ find_relative() [2/2]

XMLNode * XMLStorage::XMLNode::find_relative ( const XPath xpath)

XPath find function.

Definition at line 265 of file xmlstorage.cpp.

266 {
267  XMLNode* node = this;
268 
269  for(XPath::const_iterator it=xpath.begin(); it!=xpath.end(); ++it) {
270  node = it->find(node);
271 
272  if (!node)
273  return NULL;
274  }
275 
276  return node;
277 }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
Definition: graphics.c:170
struct node node
smooth NULL
Definition: ftsmooth.c:416

◆ get()

template<typename T >
XS_String XMLStorage::XMLNode::get ( const T attr_name,
LPCXSSTR  def = XS_EMPTY_STR 
) const
inline

read only access to an attribute

Definition at line 1095 of file xmlstorage.h.

Referenced by XMLStorage::XPathElement::matches(), subvalue(), XMLStorage::XMLBool::XMLBool(), XMLStorage::XMLDouble::XMLDouble(), XMLStorage::XMLInt::XMLInt(), and XMLStorage::XMLString::XMLString().

1096  {
1097  AttributeMap::const_iterator found = _attributes.find(attr_name);
1098 
1099  if (found != _attributes.end())
1100  return found->second;
1101  else
1102  return def;
1103  }
AttributeMap _attributes
Definition: xmlstorage.h:1271

◆ get_attributes() [1/2]

const AttributeMap& XMLStorage::XMLNode::get_attributes ( ) const
inline

Definition at line 1171 of file xmlstorage.h.

1172  {
1173  return _attributes;
1174  }
AttributeMap _attributes
Definition: xmlstorage.h:1271

◆ get_attributes() [2/2]

AttributeMap& XMLStorage::XMLNode::get_attributes ( )
inline

Definition at line 1176 of file xmlstorage.h.

1177  {
1178  return _attributes;
1179  }
AttributeMap _attributes
Definition: xmlstorage.h:1271

◆ get_children() [1/2]

const Children& XMLStorage::XMLNode::get_children ( ) const
inline

Definition at line 1161 of file xmlstorage.h.

1162  {
1163  return _children;
1164  }

◆ get_children() [2/2]

Children& XMLStorage::XMLNode::get_children ( )
inline

Definition at line 1166 of file xmlstorage.h.

1167  {
1168  return _children;
1169  }

◆ get_content()

XS_String XMLStorage::XMLNode::get_content ( ) const
inline

read element node content

Definition at line 1182 of file xmlstorage.h.

Referenced by get_sub_content().

1183  {
1184  return DecodeXMLString(_content);
1185  }
XS_String DecodeXMLString(const std::string &str)
decode XML string literals
Definition: xmlstorage.cpp:478
std::string _content
Definition: xmlstorage.h:1274

◆ get_first_child()

XMLNode* XMLStorage::XMLNode::get_first_child ( ) const
inline

Definition at line 1261 of file xmlstorage.h.

1262  {
1263  if (!_children.empty())
1264  return _children.front();
1265  else
1266  return NULL;
1267  }
smooth NULL
Definition: ftsmooth.c:416

◆ get_sub_content()

XS_String XMLStorage::XMLNode::get_sub_content ( const XPath xpath) const
inline

read content of a subnode specified by an XPath expression

Definition at line 1188 of file xmlstorage.h.

1189  {
1190  const XMLNode* node = find_relative(xpath);
1191 
1192  if (node)
1193  return node->get_content();
1194  else
1195  return XS_EMPTY_STR;
1196  }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
Definition: graphics.c:170
const XMLNode * find_relative(const XPath &xpath) const
XPath find function (const)
Definition: xmlstorage.cpp:251
#define XS_EMPTY_STR
Definition: xmlstorage.h:406

◆ operator=()

Definition at line 1051 of file xmlstorage.h.

1052  {
1053  _children.clear();
1054  _children.copy(other._children);
1055 
1056  _attributes = other._attributes;
1057 
1058  _leading = other._leading;
1059  _content = other._content;
1060  _end_leading = other._end_leading;
1061  _trailing = other._trailing;
1062 
1063  return *this;
1064  }
int other
Definition: msacm.c:1364
AttributeMap _attributes
Definition: xmlstorage.h:1271
std::string _content
Definition: xmlstorage.h:1274
std::string _leading
Definition: xmlstorage.h:1273
std::string _end_leading
Definition: xmlstorage.h:1275
void copy(const Children &other)
Definition: xmlstorage.h:943
std::string _trailing
Definition: xmlstorage.h:1276

◆ operator[]()

index operator write access to an attribute

Definition at line 1089 of file xmlstorage.h.

1090  {
1091  return _attributes[attr_name];
1092  }
AttributeMap _attributes
Definition: xmlstorage.h:1271

◆ original_write_worker()

void XMLStorage::XMLNode::original_write_worker ( std::ostream out) const
protected

write node with children tree to output stream using original white space

Definition at line 528 of file xmlstorage.cpp.

529 {
530  out << _leading << '<' << EncodeXMLString(*this);
531 
532  for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
533  out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
534 
535  if (!_children.empty() || !_content.empty()) {
536  out << '>';
537 
538  if (_cdata_content)
539  out << CDATA_START << _content << CDATA_END;
540  else
541  out << _content;
542 
543  for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
544  (*it)->original_write_worker(out);
545 
546  out << _end_leading << "</" << EncodeXMLString(*this) << '>';
547  } else
548  out << "/>";
549 
550  out << _trailing;
551 }
AttributeMap _attributes
Definition: xmlstorage.h:1271
static FILE * out
Definition: regtests2xml.c:44
std::string _content
Definition: xmlstorage.h:1274
std::string _leading
Definition: xmlstorage.h:1273
std::string EncodeXMLString(const XS_String &str, bool cdata)
encode XML string literals
Definition: xmlstorage.cpp:374

◆ plain_write_worker()

void XMLStorage::XMLNode::plain_write_worker ( std::ostream out) const
protected

print node without any white space

Definition at line 555 of file xmlstorage.cpp.

556 {
557  out << '<' << EncodeXMLString(*this);
558 
559  for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
560  out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
561 
562  // strip leading white space from content
563  const char* content = _content.c_str();
564  while(isspace((unsigned char)*content)) ++content;
565 
566  if (!_children.empty() || *content) {
567  out << ">" << content;
568 
569  for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
570  (*it)->plain_write_worker(out);
571 
572  out << "</" << EncodeXMLString(*this) << ">";
573  } else
574  out << "/>";
575 }
#define isspace(c)
Definition: acclib.h:69
content
Definition: atl_ax.c:993
AttributeMap _attributes
Definition: xmlstorage.h:1271
static FILE * out
Definition: regtests2xml.c:44
std::string _content
Definition: xmlstorage.h:1274
std::string EncodeXMLString(const XS_String &str, bool cdata)
encode XML string literals
Definition: xmlstorage.cpp:374

◆ pretty_write_worker()

void XMLStorage::XMLNode::pretty_write_worker ( std::ostream out,
const XMLFormat format,
int  indent 
) const
protected

pretty print node with children tree to output stream

Definition at line 579 of file xmlstorage.cpp.

580 {
581  for(int i=indent; i--; )
583 
584  out << '<' << EncodeXMLString(*this);
585 
586  for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
587  out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
588 
589  // strip leading white space from content
590  const char* content = _content.c_str();
591  while(isspace((unsigned char)*content)) ++content;
592 
593  if (!_children.empty() || *content) {
594  out << '>' << content;
595 
596  if (!_children.empty())
597  out << format._endl;
598 
599  for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
600  (*it)->pretty_write_worker(out, format, indent+1);
601 
602  for(int i=indent; i--; )
603  out << XML_INDENT_SPACE;
604 
605  out << "</" << EncodeXMLString(*this) << '>' << format._endl;
606  } else
607  out << "/>" << format._endl;
608 }
#define isspace(c)
Definition: acclib.h:69
static const WCHAR indent[]
Definition: object.c:1156
GLenum GLclampf GLint i
Definition: glfuncs.h:14
content
Definition: atl_ax.c:993
AttributeMap _attributes
Definition: xmlstorage.h:1271
static FILE * out
Definition: regtests2xml.c:44
std::string _content
Definition: xmlstorage.h:1274
#define XML_INDENT_SPACE
Definition: xmlstorage.h:617
std::string EncodeXMLString(const XS_String &str, bool cdata)
encode XML string literals
Definition: xmlstorage.cpp:374

◆ put()

void XMLStorage::XMLNode::put ( const XS_String attr_name,
const XS_String value 
)
inline

write access to an attribute

Definition at line 1083 of file xmlstorage.h.

1084  {
1085  _attributes[attr_name] = value;
1086  }
AttributeMap _attributes
Definition: xmlstorage.h:1271
GLsizei const GLfloat * value
Definition: glext.h:6069

◆ remove_children()

void XMLStorage::XMLNode::remove_children ( const XS_String name)
inline

remove all children named 'name'

Definition at line 1073 of file xmlstorage.h.

1074  {
1075  Children::iterator it, next=_children.begin();
1076 
1077  while((it=next++) != _children.end())
1078  if (**it == name)
1079  _children.erase(it);
1080  }
static unsigned __int64 next
Definition: rand_nt.c:6
Definition: name.c:36

◆ set_content()

void XMLStorage::XMLNode::set_content ( const XS_String s,
bool  cdata = false 
)
inline

set element node content

Definition at line 1199 of file xmlstorage.h.

Referenced by XMLStorage::XMLPos::create_node_content(), and set_sub_content().

1200  {
1201  _content.assign(EncodeXMLString(s.c_str(), cdata));
1202  }
std::string _content
Definition: xmlstorage.h:1274
GLdouble s
Definition: gl.h:2039
std::string EncodeXMLString(const XS_String &str, bool cdata)
encode XML string literals
Definition: xmlstorage.cpp:374

◆ set_sub_content()

bool XMLStorage::XMLNode::set_sub_content ( const XPath xpath,
const XS_String s,
bool  cdata = false 
)
inline

set content of a subnode specified by an XPath expression

Definition at line 1205 of file xmlstorage.h.

1206  {
1207  XMLNode* node = create_relative(xpath);
1208 
1209  if (node) {
1210  node->set_content(s, cdata);
1211  return true;
1212  } else
1213  return false;
1214  }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
Definition: graphics.c:170
GLdouble s
Definition: gl.h:2039
XMLNode * create_relative(const XPath &xpath)
relative XPath create function
Definition: xmlstorage.cpp:279

◆ smart_write_worker()

void XMLStorage::XMLNode::smart_write_worker ( std::ostream out,
const XMLFormat format,
int  indent 
) const
protected

write node with children tree to output stream using smart formating

Definition at line 612 of file xmlstorage.cpp.

613 {
614  // strip the first line feed from _leading
615  const char* leading = _leading.c_str();
616  if (*leading == '\n') ++leading;
617 
618  if (!*leading)
619  for(int i=indent; i--; )
621  else
622  out << leading;
623 
624  out << '<' << EncodeXMLString(*this);
625 
626  for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
627  out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
628 
629  // strip leading white space from content
630  const char* content = _content.c_str();
631  while(isspace((unsigned char)*content)) ++content;
632 
633  if (_children.empty() && !*content)
634  out << "/>";
635  else {
636  out << '>';
637 
638  if (_cdata_content)
639  out << CDATA_START << _content << CDATA_END;
640  else if (!*content)
641  out << format._endl;
642  else
643  out << content;
644 
645  Children::const_iterator it = _children.begin();
646 
647  if (it != _children.end()) {
648  for(; it!=_children.end(); ++it)
649  (*it)->smart_write_worker(out, format, indent+1);
650 
651  // strip the first line feed from _end_leading
652  const char* end_leading = _end_leading.c_str();
653  if (*end_leading == '\n') ++end_leading;
654 
655  if (!*end_leading)
656  for(int i=indent; i--; )
657  out << XML_INDENT_SPACE;
658  else
659  out << end_leading;
660  } else
661  out << _end_leading;
662 
663  out << "</" << EncodeXMLString(*this) << '>';
664  }
665 
666  if (_trailing.empty())
667  out << format._endl;
668  else
669  out << _trailing;
670 }
#define isspace(c)
Definition: acclib.h:69
static const WCHAR indent[]
Definition: object.c:1156
GLuint n
Definition: s_context.h:57
GLenum GLclampf GLint i
Definition: glfuncs.h:14
content
Definition: atl_ax.c:993
AttributeMap _attributes
Definition: xmlstorage.h:1271
static FILE * out
Definition: regtests2xml.c:44
std::string _content
Definition: xmlstorage.h:1274
#define XML_INDENT_SPACE
Definition: xmlstorage.h:617
std::string _leading
Definition: xmlstorage.h:1273
std::string EncodeXMLString(const XS_String &str, bool cdata)
encode XML string literals
Definition: xmlstorage.cpp:374

◆ subvalue() [1/2]

XS_String XMLStorage::XMLNode::subvalue ( const XS_String child_name,
const XS_String attr_name,
int  n = 0 
) const
inline

convenient value access in children node

Definition at line 1112 of file xmlstorage.h.

1113  {
1114  const XMLNode* node = XPathElement(child_name, n).const_find(this);
1115 
1116  if (node)
1117  return node->get(attr_name);
1118  else
1119  return XS_String();
1120  }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
Definition: graphics.c:170
GLuint n
Definition: s_context.h:57
friend struct XPathElement
Definition: xmlstorage.h:982

◆ subvalue() [2/2]

XS_String& XMLStorage::XMLNode::subvalue ( const XS_String child_name,
const XS_String attr_name,
int  n = 0 
)
inline

convenient storage of distinct values in children node

Definition at line 1123 of file xmlstorage.h.

1124  {
1125  XMLNode* node = XPathElement(child_name, n).find(this);
1126 
1127  if (!node) {
1128  node = new XMLNode(child_name);
1129  add_child(node);
1130  }
1131 
1132  return (*node)[attr_name];
1133  }
XMLNode(const XS_String &name)
Definition: xmlstorage.h:984
Definition: graphics.c:170
void add_child(XMLNode *child)
add a new child node
Definition: xmlstorage.h:1067
GLuint n
Definition: s_context.h:57
friend struct XPathElement
Definition: xmlstorage.h:982

◆ write()

bool XMLStorage::XMLNode::write ( std::ostream out,
const XMLFormat format,
WRITE_MODE  mode = FORMAT_SMART,
int  indent = 0 
) const
inline

write node with children tree to output stream

Definition at line 1221 of file xmlstorage.h.

1222  {
1223  switch(mode) {
1224  case FORMAT_PLAIN:
1226  break;
1227 
1228  case FORMAT_PRETTY:
1230  break;
1231 
1232  case FORMAT_ORIGINAL:
1234  break;
1235 
1236  default: // FORMAT_SMART
1238  }
1239 
1240  return out.good();
1241  }
write XML stream preserving original white space and comments
Definition: xmlstorage.h:808
static const WCHAR indent[]
Definition: object.c:1156
void plain_write_worker(std::ostream &out) const
print node without any white space
Definition: xmlstorage.cpp:555
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
preserve original white space and comments if present; pretty print otherwise
Definition: xmlstorage.h:807
static FILE * out
Definition: regtests2xml.c:44
void pretty_write_worker(std::ostream &out, const XMLFormat &format, int indent) const
pretty print node with children tree to output stream
Definition: xmlstorage.cpp:579
void smart_write_worker(std::ostream &out, const XMLFormat &format, int indent) const
write node with children tree to output stream using smart formating
Definition: xmlstorage.cpp:612
void original_write_worker(std::ostream &out) const
write node with children tree to output stream using original white space
Definition: xmlstorage.cpp:528

Friends And Related Function Documentation

◆ const_XMLPos

friend struct const_XMLPos
friend

Definition at line 980 of file xmlstorage.h.

◆ XMLPos

friend struct XMLPos
friend

Definition at line 979 of file xmlstorage.h.

◆ XMLReaderBase

friend struct XMLReaderBase
friend

Definition at line 981 of file xmlstorage.h.

◆ XPathElement

friend struct XPathElement
friend

Definition at line 982 of file xmlstorage.h.

Member Data Documentation

◆ _attributes

AttributeMap XMLStorage::XMLNode::_attributes
protected

◆ _cdata_content

bool XMLStorage::XMLNode::_cdata_content
protected

Definition at line 1282 of file xmlstorage.h.

◆ _children

◆ _content

std::string XMLStorage::XMLNode::_content
protected

Definition at line 1274 of file xmlstorage.h.

Referenced by operator=().

◆ _end_leading

std::string XMLStorage::XMLNode::_end_leading
protected

Definition at line 1275 of file xmlstorage.h.

Referenced by operator=().

◆ _leading

std::string XMLStorage::XMLNode::_leading
protected

Definition at line 1273 of file xmlstorage.h.

Referenced by operator=().

◆ _trailing

std::string XMLStorage::XMLNode::_trailing
protected

Definition at line 1276 of file xmlstorage.h.

Referenced by operator=().


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