XT_log.debug("unmarshalling DOM element %s", dname.get());\r
}\r
\r
- XMLObject* xmlObject = buildXMLObject(element);\r
+ auto_ptr<XMLObject> xmlObject(buildXMLObject(element));\r
\r
if (element->hasAttributes()) {\r
- unmarshallAttributes(element, *xmlObject);\r
+ unmarshallAttributes(element, *(xmlObject.get()));\r
}\r
\r
- if (element->getTextContent()) {\r
- processElementContent(*xmlObject, element->getTextContent());\r
+ const XMLCh* textContent=element->getTextContent();\r
+ if (textContent && *textContent) {\r
+ XT_log.debug("processing element content");\r
+ processElementContent(*(xmlObject.get()), textContent);\r
}\r
\r
- unmarshallChildElements(element, *xmlObject);\r
+ unmarshallChildElements(element, *(xmlObject.get()));\r
\r
/* TODO: Signing\r
if (xmlObject instanceof SignableXMLObject) {\r
}\r
*/\r
\r
- DOMCachingXMLObject* dc=dynamic_cast<DOMCachingXMLObject*>(xmlObject);\r
+ DOMCachingXMLObject* dc=dynamic_cast<DOMCachingXMLObject*>(xmlObject.get());\r
if (dc)\r
dc->setDOM(element,bindDocument);\r
+ else if (bindDocument)\r
+ throw UnmarshallingException("Unable to bind document to non-DOM caching XMLObject instance.");\r
\r
- return xmlObject;\r
+ return xmlObject.release();\r
}\r
\r
XMLObject* AbstractXMLObjectUnmarshaller::buildXMLObject(const DOMElement* domElement) const\r
auto_ptr<QName> cname(XMLHelper::getNodeQName(childNode));\r
XT_log.debug("unmarshalling child element %s", cname->toString().c_str());\r
}\r
- processChildElement(xmlObject, unmarshaller->unmarshall(static_cast<DOMElement*>(childNode)));\r
+\r
+ // Retain ownership of the unmarshalled child until it's processed by the parent.\r
+ auto_ptr<XMLObject> childObject(unmarshaller->unmarshall(static_cast<DOMElement*>(childNode)));\r
+ processChildElement(xmlObject, childObject.get());\r
+ childObject.release();\r
}\r
}\r
}\r