From 54333e04060f50cb9d8babb40d3469b7a2a7c38e Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 12 Aug 2010 19:48:42 +0200 Subject: Add support for setting namespace declarations --- examples/cxx/tree/streaming/serializer.cxx | 65 +++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 11 deletions(-) (limited to 'examples/cxx/tree/streaming/serializer.cxx') diff --git a/examples/cxx/tree/streaming/serializer.cxx b/examples/cxx/tree/streaming/serializer.cxx index 58bc5cb..f6516f6 100644 --- a/examples/cxx/tree/streaming/serializer.cxx +++ b/examples/cxx/tree/streaming/serializer.cxx @@ -24,21 +24,27 @@ namespace tree = xsd::cxx::tree; class serializer_impl { public: + typedef serializer::namespace_infomap namespace_infomap; + serializer_impl (); void start (ostream& os, const string& encoding); DOMElement* - create (const string& name); + create (const string& name, const namespace_infomap&); DOMElement* - create (const string& ns, const string& qname); + create (const string& ns, const string& qname, const namespace_infomap&); void serialize (DOMElement& e); private: + void + add_namespaces (xercesc::DOMElement*, const namespace_infomap&); + +private: // Serializer. // #if _XERCES_VERSION >= 30000 @@ -101,16 +107,53 @@ start (ostream& os, const string& encoding) } DOMElement* serializer_impl:: -create (const string& name) +create (const string& name, const namespace_infomap& map) { - return doc_->createElement (xml::string (name).c_str ()); + DOMElement* r (doc_->createElement (xml::string (name).c_str ())); + + if (!map.empty ()) + add_namespaces (r, map); + + return r; } DOMElement* serializer_impl:: -create (const string& ns, const string& qname) +create (const string& ns, const string& qname, const namespace_infomap& map) +{ + DOMElement* r ( + doc_->createElementNS ( + xml::string (ns).c_str (), xml::string (qname).c_str ())); + + if (!map.empty ()) + add_namespaces (r, map); + + return r; +} + +void serializer_impl:: +add_namespaces (DOMElement* e, const namespace_infomap& map) { - return doc_->createElementNS ( - xml::string (ns).c_str (), xml::string (qname).c_str ()); + for (namespace_infomap::const_iterator i (map.begin ()), end (map.end ()); + i != end; ++i) + { + if (i->first.empty ()) + { + // Empty prefix. + // + if (!i->second.name.empty ()) + e->setAttributeNS ( + XMLUni::fgXMLNSURIName, + xml::string ("xmlns").c_str (), + xml::string (i->second.name).c_str ()); + } + else + { + e->setAttributeNS ( + XMLUni::fgXMLNSURIName, + xml::string ("xmlns:" + i->first).c_str (), + xml::string (i->second.name).c_str ()); + } + } } void serializer_impl:: @@ -147,15 +190,15 @@ start (ostream& os, const string& encoding) } DOMElement* serializer:: -create (const string& name) +create (const string& name, const namespace_infomap& map) { - return impl_->create (name); + return impl_->create (name, map); } DOMElement* serializer:: -create (const string& ns, const string& qname) +create (const string& ns, const string& qname, const namespace_infomap& map) { - return impl_->create (ns, qname); + return impl_->create (ns, qname, map); } void serializer:: -- cgit v1.1