Index: src/OFXMLElement.h ================================================================== --- src/OFXMLElement.h +++ src/OFXMLElement.h @@ -343,11 +343,11 @@ */ - (void)bindPrefix: (OFString*)prefix forNamespace: (OFString*)ns; /** - * Sets the default namespace for the element. + * Sets the default namespace for the element to be used if there is no parent. * * \param ns The default namespace for the element */ - (void)setDefaultNamespace: (OFString*)ns; Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -373,13 +373,10 @@ if (comment != nil) return [OFString stringWithFormat: @"", comment]; pool = [[OFAutoreleasePool alloc] init]; - defaultNS = (defaultNamespace != nil - ? defaultNamespace - : (parent != nil ? parent->defaultNamespace : (OFString*)nil)); if (parent != nil && parent->namespaces != nil) { OFEnumerator *keyEnumerator = [namespaces keyEnumerator]; OFEnumerator *objectEnumerator = [namespaces objectEnumerator]; id key, object; @@ -396,20 +393,25 @@ prefix = [allNamespaces objectForKey: (ns != nil ? ns : (OFString*)@"")]; parentPrefix = [allNamespaces objectForKey: (parent != nil && parent->ns != nil ? parent->ns : (OFString*)@"")]; + if (parent != nil && parent->ns != nil && parentPrefix == nil) + defaultNS = parent->ns; + else if (parent != nil && parent->defaultNamespace != nil) + defaultNS = parent->defaultNamespace; + else + defaultNS = defaultNamespace; + i = 0; length = [name cStringLength] + 3; cString = [self allocMemoryWithSize: length]; /* Start of tag */ cString[i++] = '<'; - if (prefix != nil && ![ns isEqual: defaultNS] && - (![ns isEqual: (parent != nil ? parent->ns : (OFString*)nil)] || - parentPrefix != nil)) { + if (prefix != nil && ![ns isEqual: defaultNS]) { length += [prefix cStringLength] + 1; @try { cString = [self resizeMemory: cString toSize: length]; } @catch (id e) { @@ -424,13 +426,12 @@ memcpy(cString + i, [name cString], [name cStringLength]); i += [name cStringLength]; /* xmlns if necessary */ - if (ns != nil && prefix == nil && ![ns isEqual: defaultNS] && - (![ns isEqual: (parent != nil ? parent->ns : (OFString*)nil)] || - parentPrefix != nil)) { + if (prefix == nil && ((ns != nil && ![ns isEqual: defaultNS]) || + (ns == nil && defaultNS != nil))) { length += [ns cStringLength] + 9; @try { cString = [self resizeMemory: cString toSize: length]; } @catch (id e) { @@ -441,12 +442,10 @@ memcpy(cString + i, " xmlns='", 8); i += 8; memcpy(cString + i, [ns cString], [ns cStringLength]); i += [ns cStringLength]; cString[i++] = '\''; - - defaultNS = ns; } /* Attributes */ attributesCArray = [attributes cArray]; attributesCount = [attributes count];