Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -254,20 +254,16 @@ for (j = 0; j < attrs_count; j++) { OFString *attr_name = [attrs_carray[j] name]; OFString *attr_prefix = nil; tmp = [[attrs_carray[j] stringValue] stringByXMLEscaping]; - if (([attrs_carray[j] namespace] == nil && namespace != nil && - ![[attrs_carray[j] name] isEqual: @"xmlns"]) || - ([attrs_carray[j] namespace] != nil && namespace == nil) || - ([attrs_carray[j] namespace] != nil && - ![[attrs_carray[j] namespace] isEqual: namespace])) - if ((attr_prefix = [all_namespaces - objectForKey: [attrs_carray[j] namespace]]) == nil) - @throw [OFUnboundNamespaceException - newWithClass: isa - namespace: [attrs_carray[j] namespace]]; + if ([attrs_carray[j] namespace] != nil && + (attr_prefix = [all_namespaces objectForKey: + [attrs_carray[j] namespace]]) == nil) + @throw [OFUnboundNamespaceException + newWithClass: isa + namespace: [attrs_carray[j] namespace]]; len += [attr_name cStringLength] + (attr_prefix != nil ? [attr_prefix cStringLength] + 1 : 0) + [tmp cStringLength] + 4; Index: src/OFXMLParser.m ================================================================== --- src/OFXMLParser.m +++ src/OFXMLParser.m @@ -58,21 +58,16 @@ OFArray *namespaces, Class isa) { OFString *attr_ns; OFString *attr_prefix = attr->namespace; - if ([[attr name] isEqual: @"xmlns"] && attr_prefix == nil) { - [attr->namespace release]; - attr->namespace = nil; + if (attr_prefix == nil) return; - } - attr_ns = namespace_for_prefix( - (attr_prefix != nil ? attr_prefix : prefix), namespaces); + attr_ns = namespace_for_prefix(attr_prefix, namespaces); - if ((attr_prefix != nil && attr_ns == nil) || - (ns != nil && attr_ns == nil)) + if ((attr_prefix != nil && attr_ns == nil)) @throw [OFUnboundNamespaceException newWithClass: isa prefix: attr_prefix]; [attr->namespace release]; attr->namespace = [attr_ns retain]; Index: tests/OFXMLElementTests.m ================================================================== --- tests/OFXMLElementTests.m +++ tests/OFXMLElementTests.m @@ -39,11 +39,10 @@ TEST(@"+[elementWithName:namespace:]", (elem[2] = [OFXMLElement elementWithName: @"foo" namespace: @"urn:objfw:test"]) && R([elem[2] addAttributeWithName: @"test" - namespace: @"urn:objfw:test" stringValue: @"test"]) && R([elem[2] setPrefix: @"objfw-test" forNamespace: @"urn:objfw:test"]) && [[elem[2] string] isEqual: @""]) Index: tests/OFXMLParserTests.m ================================================================== --- tests/OFXMLParserTests.m +++ tests/OFXMLParserTests.m @@ -106,12 +106,11 @@ [[[attrs objectAtIndex: 0] namespace] isEqual: @"urn:objfw:test:foo"] && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"bla"] && /* blafoo attr */ [[[attrs objectAtIndex: 1] name] isEqual: @"blafoo"] && - [[[attrs objectAtIndex: 1] namespace] isEqual: - @"urn:objfw:test:foo"] && + [[attrs objectAtIndex: 1] namespace] == nil && [[[attrs objectAtIndex: 1] stringValue] isEqual: @"foo"]) break; case 12: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; @@ -124,12 +123,11 @@ [[[attrs objectAtIndex: 0] namespace] isEqual: @"urn:objfw:test:foo"] && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"asd"] && /* quxqux attr */ [[[attrs objectAtIndex: 1] name] isEqual: @"quxqux"] && - [[[attrs objectAtIndex: 1] namespace] isEqual: - @"urn:objfw:test:foobar"] && + [[attrs objectAtIndex: 1] namespace] == nil && [[[attrs objectAtIndex: 1] stringValue] isEqual: @"test"]) break; case 14: TEST(msg, et == TAG_END && [name isEqual: @"blup"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) @@ -147,12 +145,11 @@ @"http://www.w3.org/2000/xmlns/"] && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"urn:objfw:test:bla"] && /* qux attr */ [[[attrs objectAtIndex: 1] name] isEqual: @"qux"] && - [[[attrs objectAtIndex: 1] namespace] isEqual: - @"urn:objfw:test:bla"] && + [[attrs objectAtIndex: 1] namespace] == nil && [[[attrs objectAtIndex: 1] stringValue] isEqual: @"qux"] && /* bla:foo attr */ [[[attrs objectAtIndex: 2] name] isEqual: @"foo"] && [[[attrs objectAtIndex: 2] namespace] isEqual: @"urn:objfw:test:bla"] && @@ -175,12 +172,11 @@ [[attrs objectAtIndex: 0] namespace] == nil && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"urn:objfw:test:abc"] && /* abc attr */ [[[attrs objectAtIndex: 1] name] isEqual: @"abc"] && - [[[attrs objectAtIndex: 1] namespace] isEqual: - @"urn:objfw:test:abc"] && + [[attrs objectAtIndex: 1] namespace] == nil && [[[attrs objectAtIndex: 1] stringValue] isEqual: @"abc"] && /* foo:abc attr */ [[[attrs objectAtIndex: 2] name] isEqual: @"abc"] && [[[attrs objectAtIndex: 2] namespace] isEqual: @"urn:objfw:test:foo"] &&