Index: src/OFXMLElement.h ================================================================== --- src/OFXMLElement.h +++ src/OFXMLElement.h @@ -325,11 +325,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 @@ -367,13 +367,10 @@ str->isa = [OFString class]; return str; } pool = [[OFAutoreleasePool alloc] init]; - def_ns = (defaultNamespace != nil - ? defaultNamespace - : (parent != nil ? parent->defaultNamespace : (OFString*)nil)); if (parent != nil && parent->namespaces != nil) { OFEnumerator *key_enum = [namespaces keyEnumerator]; OFEnumerator *obj_enum = [namespaces objectEnumerator]; id key, obj; @@ -390,20 +387,25 @@ prefix = [all_namespaces objectForKey: (ns != nil ? ns : (OFString*)@"")]; parent_prefix = [all_namespaces objectForKey: (parent != nil && parent->ns != nil ? parent->ns : (OFString*)@"")]; + if (parent != nil && parent->ns != nil && parent_prefix == nil) + def_ns = parent->ns; + else if (parent != nil && parent->defaultNamespace != nil) + def_ns = parent->defaultNamespace; + else + def_ns = defaultNamespace; + i = 0; len = [name cStringLength] + 3; str_c = [self allocMemoryWithSize: len]; /* Start of tag */ str_c[i++] = '<'; - if (prefix != nil && ![ns isEqual: def_ns] && - (![ns isEqual: (parent != nil ? parent->ns : (OFString*)nil)] || - parent_prefix != nil)) { + if (prefix != nil && ![ns isEqual: def_ns]) { len += [prefix cStringLength] + 1; @try { str_c = [self resizeMemory: str_c toSize: len]; } @catch (id e) { @@ -419,13 +421,12 @@ memcpy(str_c + i, [name cString], [name cStringLength]); i += [name cStringLength]; /* xmlns if necessary */ - if (ns != nil && prefix == nil && ![ns isEqual: def_ns] && - (![ns isEqual: (parent != nil ? parent->ns : (OFString*)nil)] || - parent_prefix != nil)) { + if (prefix == nil && ((ns != nil && ![ns isEqual: def_ns]) || + (ns == nil && def_ns != nil))) { len += [ns cStringLength] + 9; @try { str_c = [self resizeMemory: str_c toSize: len]; @@ -437,12 +438,10 @@ memcpy(str_c + i, " xmlns='", 8); i += 8; memcpy(str_c + i, [ns cString], [ns cStringLength]); i += [ns cStringLength]; str_c[i++] = '\''; - - def_ns = ns; } /* Attributes */ attrs_carray = [attributes cArray]; attrs_count = [attributes count];