Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -193,17 +193,16 @@ - (OFArray*)children { return [[children copy] autorelease]; } -- (OFString*)_stringValueWithParentNamespaces: (OFDictionary*)parent_namespaces - parentDefaultNamespace: (OFString*)parent_default_ns +- (OFString*)_stringValueWithParent: (OFXMLElement*)parent { OFAutoreleasePool *pool, *pool2; char *str_c; size_t len, i, j, attrs_count; - OFString *prefix = nil; + OFString *prefix, *parent_prefix; OFXMLAttribute **attrs_carray; OFString *ret, *tmp; OFMutableDictionary *all_namespaces; OFString *def_ns; @@ -230,37 +229,41 @@ return str; } pool = [[OFAutoreleasePool alloc] init]; def_ns = (defaultNamespace != nil - ? defaultNamespace : parent_default_ns); + ? defaultNamespace + : (parent != nil ? parent->defaultNamespace : nil)); - if (parent_namespaces != nil) { + if (parent != nil && parent->namespaces != nil) { OFEnumerator *key_enum = [namespaces keyEnumerator]; OFEnumerator *obj_enum = [namespaces objectEnumerator]; id key, obj; - all_namespaces = [[parent_namespaces mutableCopy] autorelease]; + all_namespaces = [[parent->namespaces mutableCopy] autorelease]; while ((key = [key_enum nextObject]) != nil && (obj = [obj_enum nextObject]) != nil) [all_namespaces setObject: obj forKey: key]; } else all_namespaces = namespaces; - prefix = [all_namespaces objectForKey: - (ns != nil ? ns : (OFString*)@"")]; + prefix = [all_namespaces objectForKey: (ns != nil ? ns : @"")]; + parent_prefix = [all_namespaces objectForKey: + (parent != nil && parent->ns != nil ? parent->ns : @"")]; i = 0; len = [name cStringLength] + 3; str_c = [self allocMemoryWithSize: len]; /* Start of tag */ str_c[i++] = '<'; - if (prefix != nil && ![ns isEqual: def_ns]) { + if (prefix != nil && ![ns isEqual: def_ns] && + (![ns isEqual: (parent != nil ? parent->ns : nil)] || + parent_prefix != nil)) { len += [prefix cStringLength] + 1; @try { str_c = [self resizeMemory: str_c toSize: len]; } @catch (id e) { @@ -276,11 +279,13 @@ memcpy(str_c + i, [name cString], [name cStringLength]); i += [name cStringLength]; /* xmlns if necessary */ - if (ns != nil && prefix == nil && ![ns isEqual: def_ns]) { + if (ns != nil && prefix == nil && ![ns isEqual: def_ns] && + (![ns isEqual: (parent != nil ? parent->ns : nil)] || + parent_prefix != nil)) { len += [ns cStringLength] + 9; @try { str_c = [self resizeMemory: str_c toSize: len]; @@ -358,12 +363,11 @@ for (j = 0; j < children_count; j++) append(tmp, @selector( appendCStringWithoutUTF8Checking:), [[children_carray[j] - _stringValueWithParentNamespaces: all_namespaces - parentDefaultNamespace: def_ns] cString]); + _stringValueWithParent: self] cString]); len += [tmp cStringLength] + [name cStringLength] + 2; @try { str_c = [self resizeMemory: str_c toSize: len]; @@ -411,12 +415,11 @@ return ret; } - (OFString*)stringValue { - return [self _stringValueWithParentNamespaces: nil - parentDefaultNamespace: nil]; + return [self _stringValueWithParent: nil]; } - (OFString*)description { return [self stringValue]; Index: src/OFXMLElementBuilder.m ================================================================== --- src/OFXMLElementBuilder.m +++ src/OFXMLElementBuilder.m @@ -82,14 +82,14 @@ attrs_cnt = [attrs count]; add_attr = [elem methodForSelector: @selector(addAttribute:)]; for (i = 0; i < attrs_cnt; i++) { if ([attrs_c[i] namespace] == nil && - [[attrs_c[i] name] isEqual: @"xmlns"]) { - [elem setDefaultNamespace: [attrs_c[i] stringValue]]; + [[attrs_c[i] name] isEqual: @"xmlns"]) continue; - } else if ([[attrs_c[i] namespace] + + if ([[attrs_c[i] namespace] isEqual: @"http://www.w3.org/2000/xmlns/"]) [elem setPrefix: [attrs_c[i] name] forNamespace: [attrs_c[i] stringValue]]; add_attr(elem, @selector(addAttribute:), attrs_c[i]);