54 const std::string& rFileName,
55 const ::xsd::cxx::tree::properties<char>& rProps,
58 XSD_DOM_AUTO_PTR<xercesc::DOMDocument> p_doc;
62 xercesc::XMLPlatformUtils::Initialize();
64 ::xsd::cxx::tree::error_handler<char> error_handler;
68 error_handler.throw_if_failed< ::xsd::cxx::tree::parsing<char> >();
70 catch (const ::xsd::cxx::tree::parsing<char>& e)
74 const ::xsd::cxx::tree::diagnostics<char>& diags = e.diagnostics();
75 const ::xsd::cxx::tree::error<char>& first_error = diags[0];
76 if (first_error.line() == 0u)
78 std::cerr << first_error << std::endl;
79 EXCEPTION(
"Missing file parsing configuration file: " + rFileName);
83 std::cerr << e << std::endl;
84 EXCEPTION(
"XML parsing error in configuration file: " + rFileName);
121 const std::string& rFileName,
122 ::xsd::cxx::xml::error_handler<char>& rErrorHandler,
123 const ::xsd::cxx::tree::properties<char>& rProps,
126 using namespace xercesc;
127 namespace xml = xsd::cxx::xml;
130 const XMLCh ls_id [] = {chLatin_L, chLatin_S, chNull};
131 DOMImplementation* p_impl(DOMImplementationRegistry::getDOMImplementation(ls_id));
133 XSD_DOM_AUTO_PTR<DOMLSParser> p_parser(p_impl->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0));
134 DOMConfiguration* p_conf(p_parser->getDomConfig());
137 p_conf->setParameter(XMLUni::fgDOMComments,
false);
140 p_conf->setParameter(XMLUni::fgDOMDatatypeNormalization,
true);
146 p_conf->setParameter(XMLUni::fgDOMEntities,
false);
149 p_conf->setParameter(XMLUni::fgDOMNamespaces,
true);
152 p_conf->setParameter(XMLUni::fgDOMElementContentWhitespace,
false);
157 p_conf->setParameter(XMLUni::fgDOMValidate,
true);
158 p_conf->setParameter(XMLUni::fgXercesSchema,
true);
159 p_conf->setParameter(XMLUni::fgXercesSchemaFullChecking,
false);
161 if (!rProps.schema_location().empty())
163 xml::string locn(rProps.schema_location());
164 const void* p_locn(locn.c_str());
165 p_conf->setParameter(XMLUni::fgXercesSchemaExternalSchemaLocation,
166 const_cast<void*
>(p_locn));
168 if (!rProps.no_namespace_schema_location().empty())
170 xml::string locn(rProps.no_namespace_schema_location());
171 const void* p_locn(locn.c_str());
173 p_conf->setParameter(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation,
174 const_cast<void*
>(p_locn));
181 p_conf->setParameter(XMLUni::fgDOMValidate,
false);
182 p_conf->setParameter(XMLUni::fgXercesSchema,
false);
183 p_conf->setParameter(XMLUni::fgXercesSchemaFullChecking,
false);
188 p_conf->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument,
true);
191 xml::dom::bits::error_handler_proxy<char> ehp(rErrorHandler);
192 p_conf->setParameter(XMLUni::fgDOMErrorHandler, &ehp);
195 XSD_DOM_AUTO_PTR<DOMDocument> p_doc(p_parser->parseURI(rFileName.c_str()));
208 std::string prefix = X2C(pNode->getPrefix());
209 std::string name = X2C(pNode->getLocalName());
210 std::string nsuri = X2C(pNode->getNamespaceURI());
211 std::cout << rMsg <<
" " << pNode <<
" " << prefix <<
":" << name <<
" in " << nsuri << std::endl;
214 for (xercesc::DOMNode* p_node = pNode->getFirstChild();
216 p_node = p_node->getNextSibling())
218 std::cout <<
" child type " << p_node->getNodeType();
221 xercesc::DOMNamedNodeMap* p_attrs = pNode->getAttributes();
224 for (XMLSize_t i=0; i<p_attrs->getLength(); i++)
226 xercesc::DOMNode* p_attr = p_attrs->item(i);
227 std::string value = X2C(p_attr->getNodeValue());
228 PrintNode(
" attr (" + value +
")", p_attr,
false);
236 xercesc::DOMElement* pElement,
237 const XMLCh* pNamespace)
239 using namespace xercesc;
242 DOMNamedNodeMap* p_orig_attrs = pElement->getAttributes();
243 std::vector<std::string> attr_values;
246 for (XMLSize_t i=0; i<p_orig_attrs->getLength(); i++)
248 DOMNode* p_attr = p_orig_attrs->item(i);
249 attr_values.push_back(X2C(p_attr->getNodeValue()));
252 DOMElement* p_new_elt =
static_cast<DOMElement*
>(
253 pDocument->renameNode(pElement, pNamespace, pElement->getLocalName()));
258 DOMNamedNodeMap* p_new_attrs = p_new_elt->getAttributes();
260 assert(p_new_attrs == p_orig_attrs);
261 assert(p_new_attrs->getLength() == attr_values.size());
262 for (XMLSize_t i=0; i<p_new_attrs->getLength(); i++)
264 DOMNode* p_attr = p_new_attrs->item(i);
265 p_attr->setNodeValue(X(attr_values[i]));
271 for (std::vector<DOMElement*>::iterator it = children.begin(); it != children.end(); ++it)
289 std::vector<xercesc::DOMElement*> children;
290 for (xercesc::DOMNode* p_node = pElement->getFirstChild();
292 p_node = p_node->getNextSibling())
294 if (p_node->getNodeType() == xercesc::DOMNode::ELEMENT_NODE)
296 children.push_back(
static_cast<xercesc::DOMElement*
>(p_node));
304 const std::vector<std::string>& rNames,
305 std::vector<xercesc::DOMElement*>& rResults,
308 for (xercesc::DOMNode* p_node = pContextElement->getFirstChild();
310 p_node = p_node->getNextSibling())
312 if (p_node->getNodeType() == xercesc::DOMNode::ELEMENT_NODE &&
313 X2C(p_node->getLocalName()) == rNames[depth])
315 xercesc::DOMElement* p_child_elt =
static_cast<xercesc::DOMElement*
>(p_node);
316 if (depth == rNames.size() - 1)
318 rResults.push_back(p_child_elt);
329 const std::string& rPath)
331 std::vector<xercesc::DOMElement*> results;
332 std::vector<std::string> path;
333 size_t start_pos = 0;
334 size_t slash_pos = 0;
335 while (slash_pos != std::string::npos)
337 slash_pos = rPath.find(
'/', start_pos);
338 if (slash_pos == std::string::npos)
340 path.push_back(rPath.substr(start_pos));
344 path.push_back(rPath.substr(start_pos, slash_pos-start_pos));
346 start_pos = slash_pos + 1;
354 xercesc::DOMElement* pElement,
355 const XMLCh* pNewElementLocalName)
357 const XMLCh* p_namespace_uri = pElement->getNamespaceURI();
358 const XMLCh* p_prefix = pElement->getPrefix();
359 const XMLCh* p_qualified_name;
365 xercesc::QName qname(p_prefix, pNewElementLocalName, 0);
366 p_qualified_name = qname.getRawName();
371 p_qualified_name = pNewElementLocalName;
373 xercesc::DOMElement* p_wrapper_elt = pDocument->createElementNS(p_namespace_uri, p_qualified_name);
375 xercesc::DOMNodeList* p_children = pElement->getChildNodes();
376 for (
unsigned i=0; i<p_children->getLength(); i++)
378 xercesc::DOMNode* p_child = pElement->removeChild(p_children->item(i));
379 p_wrapper_elt->appendChild(p_child);
382 pElement->appendChild(p_wrapper_elt);