Add xsi:nil support to objects.
[shibboleth/xmltooling.git] / xmltooling / AbstractAttributeExtensibleXMLObject.cpp
index a445248..2efde22 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2006 Internet2
+ *  Copyright 2001-2007 Internet2
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -55,32 +55,29 @@ void AbstractAttributeExtensibleXMLObject::setAttribute(const QName& qualifiedNa
     if (i!=m_attributeMap.end()) {
         releaseThisandParentDOM();
         XMLString::release(&(i->second));
-        if (value) {
+        if (value && *value) {
             i->second=XMLString::replicate(value);
+            if (ID)
+                m_idAttribute=i;
         }
         else {
             if (m_idAttribute==i)
                 m_idAttribute=m_attributeMap.end();
             m_attributeMap.erase(i);
         }
-        
-        if (ID) {
-            m_idAttribute=i;
-        }
     }
-    else if (value) {
+    else if (value && *value) {
         releaseThisandParentDOM();
         m_attributeMap[qualifiedName]=XMLString::replicate(value);
-        if (ID) {
+        if (ID)
             m_idAttribute = m_attributeMap.find(qualifiedName);
-        } 
     }
 }
 
 void AbstractAttributeExtensibleXMLObject::unmarshallExtensionAttribute(const DOMAttr* attribute)
 {
     QName q(attribute->getNamespaceURI(),attribute->getLocalName(),attribute->getPrefix());
-    bool ID = isRegisteredIDAttribute(q); 
+    bool ID = attribute->isId() || isRegisteredIDAttribute(q);
     setAttribute(q,attribute->getNodeValue(),ID);
     if (ID) {
         attribute->getOwnerElement()->setIdAttributeNode(attribute);
@@ -94,7 +91,7 @@ void AbstractAttributeExtensibleXMLObject::marshallExtensionAttributes(DOMElemen
         if (i->first.hasPrefix())
             attr->setPrefix(i->first.getPrefix());
         attr->setNodeValue(i->second);
-        domElement->setAttributeNode(attr);
+        domElement->setAttributeNodeNS(attr);
         if (m_idAttribute==i)
             domElement->setIdAttributeNode(attr);
     }