\r
#define XT_log (*static_cast<Category*>(m_log))\r
\r
-AbstractXMLObjectUnmarshaller::AbstractXMLObjectUnmarshaller(const XMLCh* targetNamespaceURI, const XMLCh* targetLocalName)\r
- : m_targetQName(targetNamespaceURI, targetLocalName),\r
- m_log(&Category::getInstance(XMLTOOLING_LOGCAT".Unmarshaller")) {\r
- if (!targetLocalName || !*targetLocalName)\r
- throw UnmarshallingException("targetLocalName cannot be null or empty");\r
-}\r
+AbstractXMLObjectUnmarshaller::AbstractXMLObjectUnmarshaller()\r
+ : m_log(&Category::getInstance(XMLTOOLING_LOGCAT".Unmarshaller")) {}\r
\r
XMLObject* AbstractXMLObjectUnmarshaller::unmarshall(DOMElement* element, bool bindDocument) const\r
{\r
unmarshallAttributes(element, *(xmlObject.get()));\r
}\r
\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.get()));\r
\r
/* TODO: Signing\r
processChildElement(xmlObject, childObject.get());\r
childObject.release();\r
}\r
+ else if (childNode->getNodeType() == DOMNode::TEXT_NODE) {\r
+ XT_log.debug("processing element content");\r
+ processElementContent(xmlObject, childNode->getNodeValue());\r
+ }\r
}\r
}\r
*/\r
\r
#include <cxxtest/TestSuite.h>\r
+#include <xmltooling/AbstractAttributeExtensibleXMLObject.h>\r
#include <xmltooling/AbstractDOMCachingXMLObject.h>\r
+#include <xmltooling/AbstractExtensibleXMLObject.h>\r
#include <xmltooling/exceptions.h>\r
#include <xmltooling/XMLObjectBuilder.h>\r
#include <xmltooling/XMLToolingConfig.h>\r
#pragma warning( disable : 4250 4251 )\r
#endif\r
\r
-class SimpleXMLObjectUnmarshaller;\r
-\r
class SimpleXMLObject : public AbstractDOMCachingXMLObject\r
{\r
public:\r
class SimpleXMLObjectBuilder : public XMLObjectBuilder\r
{\r
public:\r
- XMLObject* buildObject() const {\r
+ SimpleXMLObject* buildObject() const {\r
return new SimpleXMLObject();\r
}\r
};\r
class SimpleXMLObjectMarshaller : public AbstractXMLObjectMarshaller\r
{\r
public:\r
- SimpleXMLObjectMarshaller() : AbstractXMLObjectMarshaller(SimpleXMLObject::NAMESPACE, SimpleXMLObject::LOCAL_NAME) {}\r
+ SimpleXMLObjectMarshaller() {}\r
\r
private:\r
void marshallAttributes(const XMLObject& xmlObject, DOMElement* domElement) const {\r
class SimpleXMLObjectUnmarshaller : public AbstractXMLObjectUnmarshaller\r
{\r
public:\r
- SimpleXMLObjectUnmarshaller() : AbstractXMLObjectUnmarshaller(SimpleXMLObject::NAMESPACE, SimpleXMLObject::LOCAL_NAME) {}\r
+ SimpleXMLObjectUnmarshaller() {}\r
\r
private:\r
void processChildElement(XMLObject& parentXMLObject, XMLObject* childXMLObject) const {\r
\r
};\r
\r
+class WildcardXMLObjectMarshaller;\r
+\r
+class WildcardXMLObject : public AbstractExtensibleXMLObject, public AbstractAttributeExtensibleXMLObject\r
+{\r
+ friend class WildcardXMLObjectMarshaller;\r
+public:\r
+ WildcardXMLObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix)\r
+ : AbstractDOMCachingXMLObject(nsURI, localName, prefix),\r
+ AbstractExtensibleXMLObject(nsURI, localName, prefix),\r
+ AbstractAttributeExtensibleXMLObject(nsURI, localName, prefix) {}\r
+ virtual ~WildcardXMLObject() {}\r
+ \r
+ WildcardXMLObject* clone() const {\r
+ auto_ptr<XMLObject> domClone(AbstractDOMCachingXMLObject::clone());\r
+ WildcardXMLObject* ret=dynamic_cast<WildcardXMLObject*>(domClone.get());\r
+ if (ret) {\r
+ domClone.release();\r
+ return ret;\r
+ }\r
+\r
+ ret=new WildcardXMLObject(\r
+ getElementQName().getNamespaceURI(),getElementQName().getLocalPart(),getElementQName().getPrefix()\r
+ );\r
+ for (map<QName,XMLCh*>::const_iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++) {\r
+ ret->m_attributeMap[i->first]=XMLString::replicate(i->second);\r
+ }\r
+ xmltooling::clone(m_children, ret->m_children);\r
+ return ret;\r
+ }\r
+};\r
+\r
+class WildcardXMLObjectBuilder : public XMLObjectBuilder\r
+{\r
+public:\r
+ XMLObject* buildObject() const {\r
+ throw XMLObjectException("No default builder available.");\r
+ }\r
+\r
+ WildcardXMLObject* buildObject(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix) const {\r
+ return new WildcardXMLObject(nsURI,localName,prefix);\r
+ }\r
+};\r
+\r
+class WildcardXMLObjectMarshaller : public AbstractXMLObjectMarshaller\r
+{\r
+public:\r
+ WildcardXMLObjectMarshaller() : AbstractXMLObjectMarshaller() {}\r
+\r
+private:\r
+ void marshallAttributes(const XMLObject& xmlObject, DOMElement* domElement) const {\r
+ const WildcardXMLObject& wcXMLObject = dynamic_cast<const WildcardXMLObject&>(xmlObject);\r
+\r
+ for (map<QName,XMLCh*>::const_iterator i=wcXMLObject.m_attributeMap.begin(); i!=wcXMLObject.m_attributeMap.end(); i++) {\r
+ DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(i->first.getNamespaceURI(),i->first.getLocalPart());\r
+ if (i->first.hasPrefix())\r
+ attr->setPrefix(i->first.getPrefix());\r
+ attr->setNodeValue(i->second);\r
+ domElement->setAttributeNode(attr);\r
+ }\r
+ }\r
+\r
+ void marshallElementContent(const XMLObject& xmlObject, DOMElement* domElement) const {\r
+ const WildcardXMLObject& wcXMLObject = dynamic_cast<const WildcardXMLObject&>(xmlObject);\r
+\r
+ if(wcXMLObject.getTextContent()) {\r
+ domElement->appendChild(domElement->getOwnerDocument()->createTextNode(wcXMLObject.getTextContent()));\r
+ }\r
+ }\r
+};\r
+\r
+class WildcardXMLObjectUnmarshaller : public AbstractXMLObjectUnmarshaller\r
+{\r
+public:\r
+ WildcardXMLObjectUnmarshaller() {}\r
+\r
+private:\r
+ XMLObject* buildXMLObject(const DOMElement* domElement) const {\r
+ const WildcardXMLObjectBuilder* builder =\r
+ dynamic_cast<const WildcardXMLObjectBuilder*>(XMLObjectBuilder::getBuilder(domElement));\r
+ if (builder)\r
+ return builder->buildObject(domElement->getNamespaceURI(),domElement->getLocalName(),domElement->getPrefix());\r
+ throw UnmarshallingException("Failed to locate WildcardObjectBuilder for element.");\r
+ }\r
+\r
+ void processChildElement(XMLObject& parentXMLObject, XMLObject* childXMLObject) const {\r
+ WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(parentXMLObject);\r
+\r
+ wcXMLObject.getXMLObjects().push_back(childXMLObject);\r
+ }\r
+\r
+ void processAttribute(XMLObject& xmlObject, const DOMAttr* attribute) const {\r
+ WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(xmlObject);\r
+ \r
+ wcXMLObject.setAttribute(\r
+ QName(attribute->getNamespaceURI(),attribute->getLocalName(),attribute->getPrefix()),\r
+ attribute->getNodeValue()\r
+ );\r
+ }\r
+\r
+ void processElementContent(XMLObject& xmlObject, const XMLCh* elementContent) const {\r
+ WildcardXMLObject& wcXMLObject = dynamic_cast<WildcardXMLObject&>(xmlObject);\r
+ \r
+ wcXMLObject.setTextContent(elementContent);\r
+ }\r
+\r
+};\r
\r
#if defined (_MSC_VER)\r
#pragma warning( pop )\r