document=DOMImplementationRegistry::getDOMImplementation(NULL)->createDocument();\r
bindDocument=true;\r
}\r
+ \r
+ XercesJanitor<DOMDocument> janitor(bindDocument ? document : NULL);\r
\r
- try {\r
- XT_log.debug("creating root element to marshall");\r
- DOMElement* domElement = document->createElementNS(\r
- getElementQName().getNamespaceURI(), getElementQName().getLocalPart()\r
- );\r
- setDocumentElement(document, domElement);\r
+ XT_log.debug("creating root element to marshall");\r
+ DOMElement* domElement = document->createElementNS(\r
+ getElementQName().getNamespaceURI(), getElementQName().getLocalPart()\r
+ );\r
+ setDocumentElement(document, domElement);\r
#ifndef XMLTOOLING_NO_XMLSEC\r
- marshallInto(domElement, sigs);\r
+ marshallInto(domElement, sigs);\r
#else\r
- marshallInto(domElement);\r
+ marshallInto(domElement);\r
#endif\r
- //Recache the DOM.\r
- XT_log.debug("caching DOM for XMLObject (document is %sbound)", bindDocument ? "" : "not ");\r
- setDOM(domElement, bindDocument);\r
- releaseParentDOM(true);\r
+ //Recache the DOM.\r
+ XT_log.debug("caching DOM for XMLObject (document is %sbound)", bindDocument ? "" : "not ");\r
+ setDOM(domElement, bindDocument);\r
+ janitor.release(); // safely transferred\r
+ releaseParentDOM(true);\r
\r
- return domElement;\r
- }\r
- catch (...) {\r
- // Delete the document if need be, and rethrow.\r
- if (bindDocument) {\r
- document->release();\r
- }\r
- throw;\r
- }\r
+ return domElement;\r
}\r
\r
DOMElement* AbstractXMLObjectMarshaller::marshall(\r
{\r
if (getElementQName().hasPrefix())\r
targetElement->setPrefix(getElementQName().getPrefix());\r
+\r
+ if (m_schemaLocation) {\r
+ static const XMLCh schemaLocation[]= UNICODE_LITERAL_14(s,c,h,e,m,a,L,o,c,a,t,i,o,n);\r
+ if (targetElement->getParentNode()==NULL || targetElement->getParentNode()->getNodeType()==DOMNode::DOCUMENT_NODE)\r
+ targetElement->setAttributeNS(XMLConstants::XSI_NS,schemaLocation,m_schemaLocation); \r
+ }\r
+\r
marshallElementType(targetElement);\r
marshallNamespaces(targetElement);\r
marshallAttributes(targetElement);\r
marshallChildElements(targetElement);\r
marshallElementContent(targetElement);\r
-\r
+ \r
#ifndef XMLTOOLING_NO_XMLSEC\r
if (sigs) {\r
for_each(sigs->begin(),sigs->end(),mem_fun<void,Signature>(&Signature::sign));\r