55 const std::string& rFileName,
56 const ::xsd::cxx::tree::properties<char>& rProps,
59 XSD_DOM_AUTO_PTR<xercesc::DOMDocument> p_doc;
63 xercesc::XMLPlatformUtils::Initialize();
65 ::xsd::cxx::tree::error_handler<char> error_handler;
69 error_handler.throw_if_failed< ::xsd::cxx::tree::parsing<char> >();
71 catch (const ::xsd::cxx::tree::parsing<char>& e)
75#if CHASTE_XSD_VERSION_AT_LEAST(3, 0, 0)
76 const ::xsd::cxx::tree::diagnostics<char>& diags = e.diagnostics();
77 const ::xsd::cxx::tree::error<char>& first_error = diags[0];
79 const ::xsd::cxx::tree::errors<char>& errors = e.errors();
80 const ::xsd::cxx::tree::error<char>& first_error = errors[0];
82 if (first_error.line() == 0u)
84 std::cerr << first_error << std::endl;
85 EXCEPTION(
"Missing file parsing configuration file: " + rFileName);
89 std::cerr << e << std::endl;
90 EXCEPTION(
"XML parsing error in configuration file: " + rFileName);
127 const std::string& rFileName,
128 ::xsd::cxx::xml::error_handler<char>& rErrorHandler,
129 const ::xsd::cxx::tree::properties<char>& rProps,
132 using namespace xercesc;
133 namespace xml = xsd::cxx::xml;
136 const XMLCh ls_id [] = {chLatin_L, chLatin_S, chNull};
137 DOMImplementation* p_impl(DOMImplementationRegistry::getDOMImplementation(ls_id));
139#if _XERCES_VERSION >= 30000
141 XSD_DOM_AUTO_PTR<DOMLSParser> p_parser(p_impl->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0));
142 DOMConfiguration* p_conf(p_parser->getDomConfig());
145 p_conf->setParameter(XMLUni::fgDOMComments,
false);
148 p_conf->setParameter(XMLUni::fgDOMDatatypeNormalization,
true);
154 p_conf->setParameter(XMLUni::fgDOMEntities,
false);
157 p_conf->setParameter(XMLUni::fgDOMNamespaces,
true);
160 p_conf->setParameter(XMLUni::fgDOMElementContentWhitespace,
false);
165 p_conf->setParameter(XMLUni::fgDOMValidate,
true);
166 p_conf->setParameter(XMLUni::fgXercesSchema,
true);
167 p_conf->setParameter(XMLUni::fgXercesSchemaFullChecking,
false);
169 if (!rProps.schema_location().empty())
171 xml::string locn(rProps.schema_location());
172 const void* p_locn(locn.c_str());
173 p_conf->setParameter(XMLUni::fgXercesSchemaExternalSchemaLocation,
174 const_cast<void*
>(p_locn));
176 if (!rProps.no_namespace_schema_location().empty())
178 xml::string locn(rProps.no_namespace_schema_location());
179 const void* p_locn(locn.c_str());
181 p_conf->setParameter(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation,
182 const_cast<void*
>(p_locn));
189 p_conf->setParameter(XMLUni::fgDOMValidate,
false);
190 p_conf->setParameter(XMLUni::fgXercesSchema,
false);
191 p_conf->setParameter(XMLUni::fgXercesSchemaFullChecking,
false);
196 p_conf->setParameter(XMLUni::fgXercesUserAdoptsDOMDocument,
true);
199 xml::dom::bits::error_handler_proxy<char> ehp(rErrorHandler);
200 p_conf->setParameter(XMLUni::fgDOMErrorHandler, &ehp);
204 XSD_DOM_AUTO_PTR<DOMBuilder> p_parser(p_impl->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0));
206 p_parser->setFeature(XMLUni::fgDOMComments,
false);
207 p_parser->setFeature(XMLUni::fgDOMDatatypeNormalization,
true);
208 p_parser->setFeature(XMLUni::fgDOMEntities,
false);
209 p_parser->setFeature(XMLUni::fgDOMNamespaces,
true);
210 p_parser->setFeature(XMLUni::fgDOMWhitespaceInElementContent,
false);
211 p_parser->setFeature(XMLUni::fgXercesUserAdoptsDOMDocument,
true);
216 p_parser->setFeature(XMLUni::fgDOMValidation,
true);
217 p_parser->setFeature(XMLUni::fgXercesSchema,
true);
218 p_parser->setFeature(XMLUni::fgXercesSchemaFullChecking,
false);
219 if (!rProps.schema_location().empty())
221 xml::string locn(rProps.schema_location());
222 const void* p_locn(locn.c_str());
223 p_parser->setProperty(XMLUni::fgXercesSchemaExternalSchemaLocation,
224 const_cast<void*
>(p_locn));
227 if (!rProps.no_namespace_schema_location().empty())
229 xml::string locn(rProps.no_namespace_schema_location());
230 const void* p_locn(locn.c_str());
232 p_parser->setProperty(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation,
233 const_cast<void*
>(p_locn));
240 p_parser->setFeature(XMLUni::fgDOMValidation,
false);
241 p_parser->setFeature(XMLUni::fgXercesSchema,
false);
242 p_parser->setFeature(XMLUni::fgXercesSchemaFullChecking,
false);
246 xml::dom::bits::error_handler_proxy<char> ehp(rErrorHandler);
247 p_parser->setErrorHandler(&ehp);
252 XSD_DOM_AUTO_PTR<DOMDocument> p_doc(p_parser->parseURI(rFileName.c_str()));
265 std::string prefix = X2C(pNode->getPrefix());
266 std::string name = X2C(pNode->getLocalName());
267 std::string nsuri = X2C(pNode->getNamespaceURI());
268 std::cout << rMsg <<
" " << pNode <<
" " << prefix <<
":" << name <<
" in " << nsuri << std::endl;
271 for (xercesc::DOMNode* p_node = pNode->getFirstChild();
273 p_node = p_node->getNextSibling())
275 std::cout <<
" child type " << p_node->getNodeType();
278 xercesc::DOMNamedNodeMap* p_attrs = pNode->getAttributes();
281 for (XMLSize_t i=0; i<p_attrs->getLength(); i++)
283 xercesc::DOMNode* p_attr = p_attrs->item(i);
284 std::string value = X2C(p_attr->getNodeValue());
285 PrintNode(
" attr (" + value +
")", p_attr,
false);
293 xercesc::DOMElement* pElement,
294 const XMLCh* pNamespace)
296 using namespace xercesc;
299 DOMNamedNodeMap* p_orig_attrs = pElement->getAttributes();
300 std::vector<std::string> attr_values;
303 for (XMLSize_t i=0; i<p_orig_attrs->getLength(); i++)
305 DOMNode* p_attr = p_orig_attrs->item(i);
306 attr_values.push_back(X2C(p_attr->getNodeValue()));
309 DOMElement* p_new_elt =
static_cast<DOMElement*
>(
310 pDocument->renameNode(pElement, pNamespace, pElement->getLocalName()));
315 DOMNamedNodeMap* p_new_attrs = p_new_elt->getAttributes();
317 assert(p_new_attrs == p_orig_attrs);
318 assert(p_new_attrs->getLength() == attr_values.size());
319 for (XMLSize_t i=0; i<p_new_attrs->getLength(); i++)
321 DOMNode* p_attr = p_new_attrs->item(i);
322 p_attr->setNodeValue(X(attr_values[i]));
328 for (std::vector<DOMElement*>::iterator it = children.begin(); it != children.end(); ++it)
361 const std::vector<std::string>& rNames,
362 std::vector<xercesc::DOMElement*>& rResults,
365 for (xercesc::DOMNode* p_node = pContextElement->getFirstChild();
367 p_node = p_node->getNextSibling())
369 if (p_node->getNodeType() == xercesc::DOMNode::ELEMENT_NODE &&
370 X2C(p_node->getLocalName()) == rNames[depth])
372 xercesc::DOMElement* p_child_elt =
static_cast<xercesc::DOMElement*
>(p_node);
373 if (depth == rNames.size() - 1)
375 rResults.push_back(p_child_elt);
386 const std::string& rPath)
388 std::vector<xercesc::DOMElement*> results;
389 std::vector<std::string> path;
390 size_t start_pos = 0;
391 size_t slash_pos = 0;
392 while (slash_pos != std::string::npos)
394 slash_pos = rPath.find(
'/', start_pos);
395 if (slash_pos == std::string::npos)
397 path.push_back(rPath.substr(start_pos));
401 path.push_back(rPath.substr(start_pos, slash_pos-start_pos));
403 start_pos = slash_pos + 1;
411 xercesc::DOMElement* pElement,
412 const XMLCh* pNewElementLocalName)
414 const XMLCh* p_namespace_uri = pElement->getNamespaceURI();
415 const XMLCh* p_prefix = pElement->getPrefix();
416 const XMLCh* p_qualified_name;
422 xercesc::QName qname(p_prefix, pNewElementLocalName, 0);
423 p_qualified_name = qname.getRawName();
428 p_qualified_name = pNewElementLocalName;
430 xercesc::DOMElement* p_wrapper_elt = pDocument->createElementNS(p_namespace_uri, p_qualified_name);
432 xercesc::DOMNodeList* p_children = pElement->getChildNodes();
433 for (
unsigned i=0; i<p_children->getLength(); i++)
435 xercesc::DOMNode* p_child = pElement->removeChild(p_children->item(i));
436 p_wrapper_elt->appendChild(p_child);
439 pElement->appendChild(p_wrapper_elt);