Overview
Comment: | Correctly handle section 2.10 and 2.11 of XML 1.0. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
bbbb105f5f4c2146081a9c89d558658f |
User & Date: | js on 2010-06-06 22:08:24 |
Other Links: | manifest | tags |
Context
2010-06-06
| ||
22:38 | Fix partial parsing when only half of an UTF-8 char has been received. check-in: b236334eaa user: js tags: trunk | |
22:08 | Correctly handle section 2.10 and 2.11 of XML 1.0. check-in: bbbb105f5f user: js tags: trunk | |
20:04 | Support for namespaces in OFXMLElement and OFXMLParser. HUGE diff! check-in: e8c8d5a894 user: js tags: trunk | |
Changes
Modified src/OFXMLParser.m from [bab72d15ac] to [20f13b2456].
︙ | ︙ | |||
24 25 26 27 28 29 30 | int _OFXMLParser_reference; static OF_INLINE OFString* transform_string(OFMutableString *cache, OFObject <OFXMLUnescapingDelegate> *handler) { | | | | > | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | int _OFXMLParser_reference; static OF_INLINE OFString* transform_string(OFMutableString *cache, OFObject <OFXMLUnescapingDelegate> *handler) { [cache replaceOccurrencesOfString: @"\r\n" withString: @"\n"]; [cache replaceOccurrencesOfString: @"\r" withString: @"\n"]; return [cache stringByXMLUnescapingWithHandler: handler]; } static OF_INLINE OFString* namespace_for_prefix(OFString *prefix, OFArray *namespaces) { OFDictionary **carray = [namespaces cArray]; |
︙ | ︙ | |||
465 466 467 468 469 470 471 | [cache appendCString: buf + last withLength: len]; pool = [[OFAutoreleasePool alloc] init]; attr_ns = namespace_for_prefix( (attrPrefix != nil ? attrPrefix : prefix), namespaces); | | < | 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 | [cache appendCString: buf + last withLength: len]; pool = [[OFAutoreleasePool alloc] init]; attr_ns = namespace_for_prefix( (attrPrefix != nil ? attrPrefix : prefix), namespaces); attr_val = transform_string(cache, self); if (attrPrefix == nil && [attrName isEqual: @"xmlns"]) { [[namespaces lastObject] setObject: attr_val forKey: @""]; attr_ns = nil; |
︙ | ︙ |
Modified tests/OFXMLParserTests.m from [36d27ced4a] to [43eb47dbde].
︙ | ︙ | |||
55 56 57 58 59 60 61 | prefix == nil && ns == nil && attrs == nil) break; case 3: TEST(msg, et == TAG_END && [name isEqual: @"bar"] && prefix == nil && ns == nil && attrs == nil) break; case 4: | < | < | < | < | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | prefix == nil && ns == nil && attrs == nil) break; case 3: TEST(msg, et == TAG_END && [name isEqual: @"bar"] && prefix == nil && ns == nil && attrs == nil) break; case 4: TEST(msg, et == STRING && [string isEqual: @"\n"]) break; case 5: TEST(msg, et == TAG_START && [name isEqual: @"foobar"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 1 && /* xmlns attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"xmlns"] && [[attrs objectAtIndex: 0] namespace] == nil && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"urn:objfw:test:foobar"]) break; case 6: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 7: TEST(msg, et == TAG_START && [name isEqual: @"qux"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 1 && /* xmlns:foo attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"foo"] && [[[attrs objectAtIndex: 0] namespace] isEqual: @"http://www.w3.org/2000/xmlns/"] && [[[attrs objectAtIndex: 0] stringValue] isEqual: @"urn:objfw:test:foo"]) break; case 8: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 9: TEST(msg, et == TAG_START && [name isEqual: @"bla"] && [prefix isEqual: @"foo"] && [ns isEqual: @"urn:objfw:test:foo"] && [attrs count] == 2 && /* foo:bla attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"bla"] && [[[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] stringValue] isEqual: @"foo"]) break; case 10: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 11: TEST(msg, et == TAG_START && [name isEqual: @"blup"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"] && [attrs count] == 2 && /* foo:qux attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"qux"] && |
︙ | ︙ | |||
127 128 129 130 131 132 133 | [[[attrs objectAtIndex: 1] stringValue] isEqual: @"test"]) break; case 12: TEST(msg, et == TAG_END && [name isEqual: @"blup"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; case 13: | < | | 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | [[[attrs objectAtIndex: 1] stringValue] isEqual: @"test"]) break; case 12: TEST(msg, et == TAG_END && [name isEqual: @"blup"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; case 13: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 14: TEST(msg, et == TAG_START && [name isEqual: @"bla"] && [prefix isEqual: @"bla"] && [ns isEqual: @"urn:objfw:test:bla"] && [attrs count] == 3 && /* xmlns:bla attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"bla"] && |
︙ | ︙ | |||
157 158 159 160 161 162 163 | break; case 15: TEST(msg, et == TAG_END && [name isEqual: @"bla"] && [prefix isEqual: @"bla"] && [ns isEqual: @"urn:objfw:test:bla"]) break; case 16: | < | | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | break; case 15: TEST(msg, et == TAG_END && [name isEqual: @"bla"] && [prefix isEqual: @"bla"] && [ns isEqual: @"urn:objfw:test:bla"]) break; case 16: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 17: TEST(msg, et == TAG_START && [name isEqual: @"abc"] && prefix == nil && [ns isEqual: @"urn:objfw:test:abc"] && [attrs count] == 3 && /* xmlns attr */ [[[attrs objectAtIndex: 0] name] isEqual: @"xmlns"] && |
︙ | ︙ | |||
185 186 187 188 189 190 191 | [[[attrs objectAtIndex: 2] stringValue] isEqual: @"abc"]) break; case 18: TEST(msg, et == TAG_END && [name isEqual: @"abc"] && prefix == nil && [ns isEqual: @"urn:objfw:test:abc"]) break; case 19: | < | < | < | < | | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | [[[attrs objectAtIndex: 2] stringValue] isEqual: @"abc"]) break; case 18: TEST(msg, et == TAG_END && [name isEqual: @"abc"] && prefix == nil && [ns isEqual: @"urn:objfw:test:abc"]) break; case 19: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 20: TEST(msg, et == TAG_END && [name isEqual: @"bla"] && [prefix isEqual: @"foo"] && [ns isEqual: @"urn:objfw:test:foo"]) break; case 21: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 22: TEST(msg, et == COMMENT && [comment isEqual: @"commänt"]) break; case 23: TEST(msg, et == STRING && [string isEqual: @"\n "]) break; case 24: TEST(msg, et == TAG_END && [name isEqual: @"qux"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; case 25: TEST(msg, et == STRING && [string isEqual: @"\n"]) break; case 26: TEST(msg, et == TAG_END && [name isEqual: @"foobar"] && prefix == nil && [ns isEqual: @"urn:objfw:test:foobar"]) break; } } |
︙ | ︙ |