tdaq-develop-2025-02-12
HttpXmlDocument.cc
1 #include "otsdaq/XmlUtilities/HttpXmlDocument.h"
2 #include "otsdaq/Macros/CoutMacros.h"
3 #include "otsdaq/Macros/StringMacros.h"
4 #include "otsdaq/MessageFacility/MessageFacility.h"
5 #include "otsdaq/XmlUtilities/ConvertFromXML.h"
6 #include "otsdaq/XmlUtilities/ConvertToXML.h"
7 // #include "otsdaq_cmsoutertracker/otsdaq-cmsoutertracker/Ph2_ACF/Utils/MessageTools.h"
8 
9 #include <stdexcept>
10 #include <xercesc/dom/DOM.hpp>
11 #include <xercesc/dom/DOMDocument.hpp>
12 #include <xercesc/dom/DOMDocumentType.hpp>
13 #include <xercesc/dom/DOMElement.hpp>
14 #include <xercesc/dom/DOMImplementation.hpp>
15 #include <xercesc/dom/DOMImplementationLS.hpp>
16 #include <xercesc/dom/DOMImplementationRegistry.hpp>
17 // #include <xercesc/dom/DOMLSSerializer.hpp>
18 // #include <xercesc/dom/DOMLSOutput.hpp>
19 #include <xercesc/dom/DOMNodeIterator.hpp>
20 #include <xercesc/dom/DOMNodeList.hpp>
21 #include <xercesc/dom/DOMText.hpp>
22 #include <xercesc/validators/common/Grammar.hpp>
23 
24 #include <xercesc/parsers/XercesDOMParser.hpp>
25 #include <xercesc/util/XMLUni.hpp>
26 #include <xercesc/util/XercesDefs.hpp>
27 
28 #include <xercesc/framework/LocalFileFormatTarget.hpp>
29 #include <xercesc/util/OutOfMemoryException.hpp>
30 
31 #include <iostream>
32 #include <list>
33 #include <sstream>
34 
35 #include <errno.h>
36 #include <sys/stat.h>
37 #include <sys/types.h>
38 #include <unistd.h>
39 
40 using namespace ots;
41 
42 //==============================================================================
54 HttpXmlDocument::HttpXmlDocument(std::string cookieCode, std::string displayName)
55  : XmlDocument("ROOT")
56  , headerElement_(0)
57  , dataElement_(0)
58  , headerTagName_("HEADER")
59  , dataTagName_("DATA")
60  , cookieCodeTagName_("CookieCode")
61  , displayNameTagName_("DisplayName")
62 {
63  // __COUT__ << "in" << std::endl;
64  //<HEADER>
65  if(cookieCode != "" || displayName != "") // add header
66  {
67  headerElement_ = theDocument_->createElement(CONVERT_TO_XML(headerTagName_));
68  rootElement_->appendChild(headerElement_);
69  if(cookieCode != "") // add cookie code to header
70  addTextElementToParent(cookieCodeTagName_, cookieCode, headerElement_);
71  if(displayName != "") // add display name to header
72  addTextElementToParent(displayNameTagName_, displayName, headerElement_);
73  }
74 
75  //<DATA>
76  dataElement_ = theDocument_->createElement(CONVERT_TO_XML(dataTagName_));
77  rootElement_->appendChild(dataElement_);
78  // __COUT__ << "out" << std::endl;
79 }
80 
81 //==============================================================================
83  : XmlDocument(doc)
84  , headerElement_(0)
85  , dataElement_(0)
86  , headerTagName_(doc.headerTagName_)
87  , dataTagName_(doc.dataTagName_)
88  , cookieCodeTagName_(doc.cookieCodeTagName_)
89  , displayNameTagName_(doc.displayNameTagName_)
90 {
91  // __COUT__ << "in" << std::endl;
92  *this = doc;
93  // __COUT__ << "out" << std::endl;
94 }
95 
96 //==============================================================================
97 HttpXmlDocument& HttpXmlDocument::operator=(const HttpXmlDocument& doc)
98 {
99  // __COUT__ << "in" << std::endl;
100  recursiveElementCopy(doc.rootElement_, rootElement_);
101  // __COUT__ << "in" << std::endl;
102  if(doc.headerElement_ != 0)
103  headerElement_ = (xercesc::DOMElement*)rootElement_
104  ->getElementsByTagName(CONVERT_TO_XML(headerTagName_))
105  ->item(0);
106  // __COUT__ << "in" << std::endl;
107  dataElement_ = (xercesc::DOMElement*)rootElement_
108  ->getElementsByTagName(CONVERT_TO_XML(dataTagName_))
109  ->item(0);
110  // __COUT__ << "out" << std::endl;
111  return *this;
112 }
113 
114 //==============================================================================
115 HttpXmlDocument::~HttpXmlDocument(void) {}
116 
117 void HttpXmlDocument::setHeader(std::string cookieCode, std::string displayName)
118 {
119  if(headerElement_)
120  {
121  std::stringstream ss;
122  ss << __COUT_HDR_FL__
123  << "Can NOT set header to doc with a header! Only allowed for docs without "
124  "header element.";
125  __SS_THROW__;
126  }
127 
128  if(cookieCode != "" || displayName != "") // add header
129  {
130  headerElement_ = theDocument_->createElement(CONVERT_TO_XML(headerTagName_));
131  rootElement_->appendChild(headerElement_);
132  if(cookieCode != "") // add cookie code to header
133  addTextElementToParent(cookieCodeTagName_, cookieCode, headerElement_);
134  if(displayName != "") // add display name to header
135  addTextElementToParent(displayNameTagName_, displayName, headerElement_);
136  }
137 }
138 
139 //==============================================================================
140 xercesc::DOMElement* HttpXmlDocument::addTextElementToData(const std::string& childName,
141  const std::string& childValue)
142 {
143  // __COUT__ << "in - " << childName << " value: " << childValue <<std::endl << std::endl;
144  return addTextElementToParent(childName, childValue, dataElement_);
145 }
146 
147 //==============================================================================
148 xercesc::DOMElement* HttpXmlDocument::addBinaryStringToData(const std::string& childName,
149  const std::string& binary)
150 {
151  std::string convertStr = "";
152  char hexStr[3];
153  for(unsigned int i = 0; i < binary.length(); ++i)
154  {
155  // for every byte make hex
156  sprintf(hexStr, "%2.2X", ((unsigned char)binary[i]));
157  hexStr[2] = '\0';
158  convertStr += hexStr;
159  }
160 
161  return addTextElementToParent(childName, convertStr, dataElement_);
162 }
163 
164 //==============================================================================
167 unsigned int HttpXmlDocument::getChildrenCount(xercesc::DOMElement* parent)
168 {
169  if(!parent)
170  parent = dataElement_; // default to data element
171 
172  xercesc::DOMNodeList* nodeList =
173  parent->getChildNodes(); // get all children within parent
174  unsigned int count = 0;
175 
176  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
177  {
178  if(nodeList->item(i)->getNodeType() !=
179  xercesc::DOMNode::TEXT_NODE) // ignore text node children
180  ++count;
181  }
182 
183  return count;
184 }
185 
186 //==============================================================================
190 void HttpXmlDocument::removeDataElement(unsigned int dataChildIndex)
191 {
192  xercesc::DOMNodeList* nodeList =
193  dataElement_->getChildNodes(); // get all children within data
194 
195  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
196  {
197  if(nodeList->item(i)->getNodeType() ==
198  xercesc::DOMNode::TEXT_NODE) // ignore text node children
199  continue;
200 
201  if(!dataChildIndex) // remove
202  {
203  recursiveRemoveChild((xercesc::DOMElement*)(nodeList->item(i)), dataElement_);
204  return;
205  }
206 
207  --dataChildIndex; // find proper child
208  }
209 
210  // here, then child doesnt exist
211 } // end removeDataElement()
212 
213 //==============================================================================
217 {
218  // add all first level child elements of data and recurse on them
219  xercesc::DOMNodeList* nodeList =
220  document.dataElement_->getChildNodes(); // get all children within data
221  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
222  {
223  if(nodeList->item(i)->getNodeType() ==
224  xercesc::DOMNode::TEXT_NODE) // ignore text node children
225  continue;
226 
227  recursiveAddElementToParent(
228  (xercesc::DOMElement*)(nodeList->item(i)), dataElement_, true);
229  }
230 } // end copyDataChildren()
231 
232 //==============================================================================
236 void HttpXmlDocument::outputXmlDocument(std::ostringstream* out,
237  bool dispStdOut,
238  bool allowWhiteSpace)
239 {
240  recursiveOutputXmlDocument(
241  theDocument_->getDocumentElement(), out, dispStdOut, "", allowWhiteSpace);
242 } // end outputXmlDocument()
243 
244 //==============================================================================
247 void HttpXmlDocument::recursiveOutputXmlDocument(xercesc::DOMElement* currEl,
248  std::ostringstream* out,
249  bool dispStdOut,
250  std::string tabStr,
251  bool allowWhiteSpace)
252 {
253  // open field tag
254  if(dispStdOut)
255  std::cout << tabStr << "<" << XML_TO_CHAR(currEl->getNodeName());
256  if(out)
257  *out << tabStr << "<" << XML_TO_CHAR(currEl->getNodeName());
258 
259  // insert value if text node child
260  if(currEl->getFirstChild() != NULL &&
261  currEl->getFirstChild()->getNodeType() ==
262  xercesc::DOMNode::TEXT_NODE) // if has a text node first, insert as value
263  // attribute
264  {
265  if(dispStdOut)
266  std::cout << " value='"
268  XML_TO_CHAR(currEl->getFirstChild()->getNodeValue()),
269  allowWhiteSpace)
270  << "'";
271  if(out)
272  *out << " value='"
274  XML_TO_CHAR(currEl->getFirstChild()->getNodeValue()),
275  allowWhiteSpace)
276  << "'";
277  }
278 
279  xercesc::DOMNodeList* nodeList = currEl->getChildNodes(); // get all children
280 
281  // close opening field tag
282  if(dispStdOut)
283  std::cout << ((nodeList->getLength() == 0 ||
284  (nodeList->getLength() == 1 &&
285  currEl->getFirstChild()->getNodeType() ==
286  xercesc::DOMNode::TEXT_NODE))
287  ? "/"
288  : "")
289  << ">"
290  << " len:" << nodeList->getLength() << std::endl;
291  if(out)
292  {
293  // *out << ((nodeList->getLength() == 0 ||
294  // (nodeList->getLength() == 1 &&
295  // currEl->getFirstChild()->getNodeType() == xercesc::DOMNode::TEXT_NODE))
296  // ? "/"
297  // : "")
298  // << ">" << std::endl;
299  // Dario-style...
300  std::string outText = "";
301  if(currEl->getFirstChild() != NULL &&
302  currEl->getFirstChild()->getNodeType() == xercesc::DOMNode::TEXT_NODE)
303  outText = StringMacros::escapeString(
304  XML_TO_CHAR(currEl->getFirstChild()->getNodeValue()), allowWhiteSpace);
305  {
306  if(darioXMLStyle_ &&
307  !(std::string(XML_TO_CHAR(currEl->getNodeName())) == "ROOT" ||
308  std::string(XML_TO_CHAR(currEl->getNodeName())) == "HEADER" ||
309  std::string(XML_TO_CHAR(currEl->getNodeName())) == "DATA" ||
310  std::string(XML_TO_CHAR(currEl->getNodeName())) == "node" ||
311  std::string(XML_TO_CHAR(currEl->getNodeName())) == "nodes"))
312  {
313  *out << ">" << outText << "</" << XML_TO_CHAR(currEl->getNodeName())
314  << ">" << std::endl;
315  }
316  else
317  {
318  *out << ((nodeList->getLength() == 0 ||
319  (nodeList->getLength() == 1 &&
320  currEl->getFirstChild()->getNodeType() ==
321  xercesc::DOMNode::TEXT_NODE))
322  ? "/"
323  : "")
324  << ">" << std::endl;
325  }
326  }
327  // Dario-style...
328  }
329  // insert children
330  std::string newTabStr = tabStr + "\t";
331  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
332  if(nodeList->item(i)->getNodeType() !=
333  xercesc::DOMNode::TEXT_NODE) // ignore text node children
334  recursiveOutputXmlDocument((xercesc::DOMElement*)(nodeList->item(i)),
335  out,
336  dispStdOut,
337  newTabStr,
338  allowWhiteSpace);
339 
340  if(currEl == dataElement_ && //append the data string stream
341  dataSs_.str().length()) //(for large data blocks that do not need to be escaped)
342  {
343  if(dispStdOut)
344  std::cout << dataSs_.str() << std::endl;
345  if(out)
346  *out << dataSs_.str() << std::endl;
347  }
348 
349  // close tag if children
350  if(nodeList->getLength() > 1 ||
351  (nodeList->getLength() == 1 &&
352  currEl->getFirstChild()->getNodeType() != xercesc::DOMNode::TEXT_NODE))
353  {
354  if(dispStdOut)
355  std::cout << tabStr << "</" << XML_TO_CHAR(currEl->getNodeName()) << ">"
356  << std::endl;
357  if(out)
358  *out << tabStr << "</" << XML_TO_CHAR(currEl->getNodeName()) << ">"
359  << std::endl;
360  }
361 } // end recursiveOutputXmlDocument()
362 
363 //==============================================================================
367 std::string HttpXmlDocument::getMatchingValue(const std::string& field,
368  const unsigned int occurance)
369 {
370  unsigned int count = 0;
371  return recursiveFindElementValue(
372  theDocument_->getDocumentElement(), field, occurance, count);
373 }
374 
375 //==============================================================================
378 std::string HttpXmlDocument::recursiveFindElementValue(xercesc::DOMElement* currEl,
379  const std::string& field,
380  const unsigned int occurance,
381  unsigned int& count)
382 {
383  if(XML_TO_CHAR(currEl->getNodeName()) == field &&
384  occurance == count++) // found, done!!
385  {
386  if(currEl->getFirstChild() != NULL &&
387  currEl->getFirstChild()->getNodeType() ==
388  xercesc::DOMNode::TEXT_NODE) // if has a text node first, return as
389  // value attribute
391  XML_TO_CHAR(currEl->getFirstChild()->getNodeValue()));
392  else
393  return ""; // empty value attribute
394  }
395 
396  std::string retStr;
397  // look through children recursively
398  xercesc::DOMNodeList* nodeList = currEl->getChildNodes(); // get all children
399  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
400  if(nodeList->item(i)->getNodeType() !=
401  xercesc::DOMNode::TEXT_NODE) // ignore text node children
402  {
403  retStr = recursiveFindElementValue(
404  (xercesc::DOMElement*)(nodeList->item(i)), field, occurance, count);
405  if(retStr != "")
406  return retStr; // found among children already, done
407  // else continue search within children recursively
408  }
409  return ""; // nothing found
410 }
411 
412 //==============================================================================
416 void HttpXmlDocument::getAllMatchingValues(const std::string& field,
417  std::vector<std::string>& retVec)
418 {
419  recursiveFindAllElements(theDocument_->getDocumentElement(), field, &retVec);
420 }
421 
422 //==============================================================================
425 void HttpXmlDocument::recursiveFindAllElements(xercesc::DOMElement* currEl,
426  const std::string& field,
427  std::vector<std::string>* retVec)
428 {
429  if(XML_TO_CHAR(currEl->getNodeName()) == field && currEl->getFirstChild() != NULL &&
430  currEl->getFirstChild()->getNodeType() ==
431  xercesc::DOMNode::TEXT_NODE) // if has a text node first, return as value
432  // attribute
433  retVec->push_back(XML_TO_CHAR(currEl->getFirstChild()->getNodeValue()));
434 
435  // look through children recursively
436  xercesc::DOMNodeList* nodeList = currEl->getChildNodes(); // get all children
437  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
438  if(nodeList->item(i)->getNodeType() !=
439  xercesc::DOMNode::TEXT_NODE) // ignore text node children
440  recursiveFindAllElements(
441  (xercesc::DOMElement*)(nodeList->item(i)), field, retVec);
442 }
443 
444 //==============================================================================
448 xercesc::DOMElement* HttpXmlDocument::getMatchingElement(const std::string& field,
449  const unsigned int occurance)
450 {
452  theDocument_->getDocumentElement(), field, occurance);
453 }
454 
455 //==============================================================================
461  xercesc::DOMElement* parentEl, const std::string& field, const unsigned int occurance)
462 {
463  unsigned int count = 0;
464  return recursiveFindElement(parentEl, field, occurance, count);
465 }
466 
467 //==============================================================================
470 xercesc::DOMElement* HttpXmlDocument::recursiveFindElement(xercesc::DOMElement* currEl,
471  const std::string& field,
472  const unsigned int occurance,
473  unsigned int& count)
474 {
475  if(XML_TO_CHAR(currEl->getNodeName()) == field &&
476  occurance == count++) // found, done!!
477  {
478  if(currEl->getFirstChild() != NULL &&
479  currEl->getFirstChild()->getNodeType() ==
480  xercesc::DOMNode::TEXT_NODE) // if has a text node first, return as
481  // value attribute
482  return currEl;
483  else
484  return 0; // empty value attribute
485  }
486 
487  xercesc::DOMElement* retEl;
488  // look through children recursively
489  xercesc::DOMNodeList* nodeList = currEl->getChildNodes(); // get all children
490  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
491  if(nodeList->item(i)->getNodeType() !=
492  xercesc::DOMNode::TEXT_NODE) // ignore text node children
493  {
494  retEl = recursiveFindElement(
495  (xercesc::DOMElement*)(nodeList->item(i)), field, occurance, count);
496  if(retEl)
497  return retEl; // found among children already, done
498  // else continue search within children recursively
499  }
500  return 0; // nothing found
501 }
502 
503 //==============================================================================
507 void HttpXmlDocument::recursiveAddElementToParent(xercesc::DOMElement* child,
508  xercesc::DOMElement* parent,
509  bool html)
510 {
511  std::string childText = "";
512 
513  std::string childName =
514  XML_TO_CHAR(child->getNodeName()); // XML_TO_CHAR(currEl->getNodeName());
515 
516  if(child->getFirstChild() != NULL &&
517  child->getFirstChild()->getNodeType() ==
518  xercesc::DOMNode::TEXT_NODE) // if has a text node first, insert as value
519  // attribute
520  {
521  childText = XML_TO_CHAR(child->getFirstChild()->getNodeValue());
522  if(html)
523  childText = StringMacros::escapeString(childText);
524  }
525  // __COUT__<< "childName " << childName << " childText " <<
526  // childText << std::endl;
527 
528  // insert child
529  xercesc::DOMElement* newParent = addTextElementToParent(childName, childText, parent);
530 
531  // insert rest of child tree
532  xercesc::DOMNodeList* nodeList =
533  child->getChildNodes(); // get all children of child
534  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
535  {
536  if(nodeList->item(i)->getNodeType() ==
537  xercesc::DOMNode::TEXT_NODE) // ignore text node children
538  continue;
539 
540  recursiveAddElementToParent(
541  (xercesc::DOMElement*)(nodeList->item(i)), newParent, html);
542  }
543 }
544 
545 //==============================================================================
549 void HttpXmlDocument::getAllMatchingElements(const std::string& field,
550  std::vector<xercesc::DOMElement*>& retVec)
551 {
552  recursiveFindAllElements(theDocument_->getDocumentElement(), field, &retVec);
553 }
554 
555 //==============================================================================
558 void HttpXmlDocument::recursiveFindAllElements(xercesc::DOMElement* currEl,
559  const std::string& field,
560  std::vector<xercesc::DOMElement*>* retVec)
561 {
562  if(XML_TO_CHAR(currEl->getNodeName()) == field && currEl->getFirstChild() != NULL &&
563  currEl->getFirstChild()->getNodeType() ==
564  xercesc::DOMNode::TEXT_NODE) // if has a text node first, return as value
565  // attribute
566  retVec->push_back(currEl);
567 
568  // look through children recursively
569  xercesc::DOMNodeList* nodeList = currEl->getChildNodes(); // get all children
570  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
571  if(nodeList->item(i)->getNodeType() !=
572  xercesc::DOMNode::TEXT_NODE) // ignore text node children
573  recursiveFindAllElements(
574  (xercesc::DOMElement*)(nodeList->item(i)), field, retVec);
575 }
576 //==============================================================================
581 /*
582 std::string HttpXmlDocument::StringMacros::escapeString(string inString)
583 {
584  unsigned int ws = -1;
585  for(unsigned int i=0;i<inString.length();++i)
586  if(inString[i] != ' ')
587  {
588  if(inString[i] == '\r' || inString[i] == '\n') //remove new line chars
589  {
590  inString.erase(i,1); // replace special character with ;
591  --i; //step back so next char to check is correct
592  continue;
593  }
594 
595  ws = i; //last non white space char
596  if(inString[i] == '\"' || inString[i] == '\'')
597  {
598  inString.insert(i,(inString[i] == '\'')?"&apos":"&quot"); //insert \
599 before quotes inString.replace(i+5,1,1,';'); // replace special character with ;
600  i+=5; //skip to next char to check
601  }
602  }
603 
604  if(ws == (unsigned int)-1) return ""; //empty std::string since all white space
605  return inString.substr(0,ws+1); //trim right white space
606 }
607 */
608 //==============================================================================
611 bool HttpXmlDocument::loadXmlDocument(const std::string& filePath)
612 {
613  // __COUT__<< "Loading theDocument_ from file: " << filePath <<
614  // std::endl;
615 
616  struct stat fileStatus;
617 
618  if(stat(filePath.c_str(), &fileStatus) != 0)
619  {
620  //__SS__ << "File not accessible: " << filePath << std::endl;
621  //__SS_THROW__;
622  return false; // not an error for file to not exist
623  }
624 
625  // reset xml platform and theDocument_
626  terminatePlatform();
627  initPlatform();
628 
629  xercesc::XercesDOMParser* parser = new xercesc::XercesDOMParser;
630  // Configure xercesc::DOM parser.
631  parser->setValidationScheme(xercesc::XercesDOMParser::Val_Auto);
632  parser->setDoNamespaces(true);
633  parser->setDoSchema(true);
634  parser->useCachedGrammarInParse(false);
635 
636  try
637  {
638  parser->parse(filePath.c_str());
639 
640  // theDocument_ memory object owned by the parent parser object
641  theDocument_ = parser->adoptDocument(); // instead of getDocument() so parser
642  // will not free theDocument_ when
643  // released
644 
645  // Get the top-level element: Name is "root". No attributes for "root"
646  rootElement_ = theDocument_->getDocumentElement();
647  if(!rootElement_)
648  {
649  __SS__ << "empty XML theDocument_: " << filePath << std::endl;
650  __SS_THROW__;
651  throw(std::runtime_error("empty XML theDocument_"));
652  }
653 
654  recursiveFixTextFields(
655  rootElement_); // remove space and new lines from value attribute
656 
657  xercesc::DOMNodeList* nodeList =
658  theDocument_->getElementsByTagName(CONVERT_TO_XML(headerTagName_));
659  if(nodeList->getLength()) // may not always be header element
660  headerElement_ =
661  (xercesc::DOMElement*)(theDocument_
662  ->getElementsByTagName(
663  CONVERT_TO_XML(headerTagName_))
664  ->item(0));
665  else
666  headerElement_ = 0;
667 
668  dataElement_ = (xercesc::DOMElement*)(theDocument_
669  ->getElementsByTagName(
670  CONVERT_TO_XML(dataTagName_))
671  ->item(0)); // always is data
672  }
673  catch(xercesc::XMLException& e)
674  {
675  __SS__ << "Error parsing file: " << filePath << std::endl;
676  __SS_THROW__;
677  __COUT__ << "Error parsing file." << std::endl;
678  return false;
679  }
680  delete parser;
681 
682  return true;
683 }
684 
685 //==============================================================================
688 void HttpXmlDocument::recursiveFixTextFields(xercesc::DOMElement* currEl)
689 {
690  xercesc::DOMNodeList* nodeList = currEl->getChildNodes(); // get all children
691 
692  // recurse through children
693  for(unsigned int i = 0; i < nodeList->getLength(); ++i)
694  if(nodeList->item(i)->getNodeType() ==
695  xercesc::DOMNode::TEXT_NODE) // fix text nodes
696  ((xercesc::DOMElement*)(nodeList->item(i)))
697  ->setTextContent(CONVERT_TO_XML( // change text value to escaped version
698  StringMacros::escapeString(XML_TO_CHAR(
699  ((xercesc::DOMElement*)(nodeList->item(i)))->getNodeValue()))));
700  else
701  recursiveFixTextFields((xercesc::DOMElement*)(nodeList->item(i)));
702 }
703 
704 //==============================================================================
714 /*
715 xercesc::DOMElement* HttpXmlDocument::addDataElement ( std::string field, std::string
716 value, unsigned int *parentIndexArray, unsigned int parentIndexArraySize)
717 {
718 
719  //__COUT__ << "field: " << field << ", value: " << value << ",
720 parent: " << parentIndexArraySize << std::endl;
721 
722  xercesc::DOMElement* parentEl = dataElement_; // initialize parent to <DATA>
723 
724  if(parentIndexArray) //if there passed an array find parent relative to data element
725  {
726  //__COUT__<< "Using Parent Index Array" << std::endl;
727 
728  xercesc::DOMNodeList *nodeList;
729 
730  //iterate through nested parents based on parentIndexArray
731  unsigned int tmpi,cntNotTxt;
732  for(unsigned int i=0;i<parentIndexArraySize;++i)
733  {
734  nodeList = parentEl->getChildNodes(); //get all children
735  cntNotTxt = 0;
736 
737  //get cntNotTxt to proper non text node
738  for(tmpi=0;tmpi<nodeList->getLength();++tmpi)
739  {
740  if(((xercesc::DOMElement*)(nodeList->item(tmpi)))->getNodeType() ==
741 xercesc::DOMNode::TEXT_NODE) continue; //skip text nodes
742 
743  if(cntNotTxt == parentIndexArray[i]) break; //at proper parent node!
744  ++cntNotTxt; //else look for next
745  }
746 
747  //in theory, only first child can be text - ignore text node children
748  //if(parentEl->getFirstChild() != NULL &&
749 parentEl->getFirstChild()->getNodeType() == xercesc::DOMNode::TEXT_NODE) ++tmpi;
750 
751  if(tmpi >= nodeList->getLength())
752  {
753  __COUT__ << "illegal child index attempted in nested
754 parents: " << parentIndexArray[i] << ", depth: " << i << ", tmpi: " << tmpi << std::endl;
755  return 0; //illegal child index attempted in nested parents
756  }
757 
758  parentEl = (xercesc::DOMElement*)(nodeList->item(tmpi));
759  }
760  }
761 
762  return addTextElementToParent(field,value,parentEl);
763 }
764 */
xercesc::DOMElement * getMatchingElement(const std::string &field, const unsigned int occurance=0)
void getAllMatchingValues(const std::string &field, std::vector< std::string > &retVec)
void outputXmlDocument(std::ostringstream *out, bool dispStdOut=false, bool allowWhiteSpace=false)
HttpXmlDocument(std::string cookieCode="", std::string displayName="")
xercesc::DOMElement * getMatchingElementInSubtree(xercesc::DOMElement *currEl, const std::string &field, const unsigned int occurance=0)
void copyDataChildren(HttpXmlDocument &document)
void removeDataElement(unsigned int dataChildIndex=0)
default to first child
bool loadXmlDocument(const std::string &filePath)
unsigned int getChildrenCount(xercesc::DOMElement *parent=0)
std::string getMatchingValue(const std::string &field, const unsigned int occurance=0)
void getAllMatchingElements(const std::string &field, std::vector< xercesc::DOMElement * > &retVec)
xercesc::DOMElement * addTextElementToParent(const std::string &childName, const std::string &childText, xercesc::DOMElement *parent)
Definition: XmlDocument.cc:190
void recursiveRemoveChild(xercesc::DOMElement *childEl, xercesc::DOMElement *parentEl)
Definition: XmlDocument.cc:632
static std::string escapeString(std::string inString, bool allowWhiteSpace=false)