hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
XMLCleaner.cpp
Go to the documentation of this file.
1 
14 #include <sstream>
15 
16 #include "XMLCleaner.hpp"
17 
18 std::string XMLCleaner::saveXML(Poco::XML::Node* node)
19 {
20  std::string ret;
21  if(node)
22  {
23  std::stringstream strStream;
24  Poco::XML::DOMWriter writer;
25  writer.setNewLine("\n");
26  writer.setOptions(Poco::XML::XMLWriter::PRETTY_PRINT | Poco::XML::XMLWriter::WRITE_XML_DECLARATION);
27  writer.writeNode(strStream, node);
28  ret = strStream.str();
29  }
30  return ret;
31 }
32 
33 bool XMLCleaner::isOmitNode(const Poco::XML::XMLString &nodeValue) const
34 {
35  bool ret = false;
36  switch(resOmitType)
37  {
38  case ResOmitType::ROM_NOT_OMIT :
39  break;
40  case ResOmitType::ROM_EMPTY_OMIT :
41  if(nodeValue.empty())
42  {
43  ret = true;
44  }
45  break;
46  case ResOmitType::ROM_NOT_NUM_OMIT :
47  {
48  try
49  {
50  std::stoull(nodeValue, 0, 0);
51  }
52  catch(std::exception &exp)
53  {
54  ret = true;
55  }
56  }
57  break;
58  default :
59  break;
60  }
61  return ret;
62 }
63 
64 std::string XMLCleaner::process(const std::string &inXML, const std::set<std::string> &delList)
65 {
66  std::string ret;
67  Poco::XML::NamedNodeMap *nMap = NULL;
68  Poco::XML::DOMParser parser;
69  Poco::AutoPtr<Poco::XML::Document> pDoc = parser.parseString(inXML);
70  Poco::XML::NodeIterator it(pDoc, Poco::XML::NodeFilter::SHOW_ALL);
71  Poco::XML::Node* rootNode = it.root();
72  Poco::XML::Node* mainNode = rootNode;
73  Poco::XML::Node* dellNode = NULL;
74  if(rootNode)
75  {
76  dellNode = rootNode->getNodeByPath(XMLPath);
77  }
78  if(dellNode)
79  {
80  mainNode = dellNode;
81  std::vector<Poco::XML::Node*> remNodes;
82  std::map<std::string, unsigned int> alreadyNodes;
83  if(dellNode)
84  {
85  dellNode = dellNode->lastChild();
86  while(dellNode)
87  {
88  if(dellNode->nodeType() != Poco::XML::Node::TEXT_NODE && dellNode->nodeName() == elemName)
89  {
90  nMap = (dellNode->hasAttributes() ? dellNode->attributes() : NULL);
91  if(nMap)
92  {
93  Poco::XML::Node *localNode = nMap->getNamedItem(idName);
94  if(localNode)
95  {
96  std::map<std::string, unsigned int>::iterator alreadyNodesIt;
97 
98  if(isOmitNode(localNode->nodeValue()))
99  {
100  remNodes.push_back(dellNode);
101  nMap->release();
102  nMap = NULL;
103  dellNode = dellNode->previousSibling();
104  continue;
105  }
106  if((alreadyNodesIt = alreadyNodes.find(localNode->nodeValue())) == alreadyNodes.end())
107  {
108  if(delList.find(localNode->nodeValue()) != delList.end())
109  {
110  remNodes.push_back(dellNode);
111  }
112  else
113  {
114  alreadyNodes.insert(std::pair<std::string, unsigned int>(localNode->nodeValue(), 1));
115  }
116  }
117  else
118  {
119  (*alreadyNodesIt).second++;
120  remNodes.push_back(dellNode);
121  }
122  }
123  nMap->release();
124  nMap = NULL;
125  }
126  }
127  dellNode = dellNode->previousSibling();
128  }
129  }
130  for(unsigned int i = 0; i < remNodes.size(); i++)
131  {
132  mainNode->removeChild(remNodes[i]);
133  }
134  ret = std::move<std::string &&>(saveXML(rootNode));
135  }
136  return ret;
137 }