Added support for parsing XML containing CDATA content. fixes #327

This commit is contained in:
Blake Watters
2011-09-03 14:30:07 -04:00
parent de6c611338
commit 32461e916f
4 changed files with 48 additions and 5 deletions

View File

@@ -25,7 +25,7 @@
// Assume that empty strings are irrelevant and go for an attribute-collection instead
if ([val length] == 0) {
val = [NSMutableDictionary dictionary];
NSDictionary* elem = [NSDictionary dictionaryWithObject:val forKey:nodeName];
NSMutableDictionary* elem = [NSMutableDictionary dictionaryWithObject:val forKey:nodeName];
[nodes addObject:elem];
} else {
[attrs setValue:val forKey:nodeName];
@@ -42,7 +42,7 @@
[nodes addObject:attrs];
}
} else {
NSDictionary* elem = [NSDictionary dictionaryWithObject:val forKey:nodeName];
NSMutableDictionary* elem = [NSMutableDictionary dictionaryWithObject:val forKey:nodeName];
[nodes addObject:elem];
}
xmlElement* element = (xmlElement*)currentNode;
@@ -61,10 +61,10 @@
[nodes addObject:attrs];
}
}
} else if (currentNode->type == XML_TEXT_NODE) {
} else if (currentNode->type == XML_TEXT_NODE || currentNode->type == XML_CDATA_SECTION_NODE) {
xmlChar* str = xmlNodeGetContent(currentNode);
NSString* part = [NSString stringWithCString:(const char*)str encoding:NSUTF8StringEncoding];
if ([[part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] > 0) {
NSString* part = [[NSString stringWithCString:(const char*)str encoding:NSUTF8StringEncoding] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([part length] > 0) {
[nodes addObject:part];
}
xmlFree(str);

View File

@@ -71,6 +71,7 @@
252CF8C013E25FE00093BBD6 /* RKDynamicMappingModels.m in Sources */ = {isa = PBXBuildFile; fileRef = 252CF8BF13E25FE00093BBD6 /* RKDynamicMappingModels.m */; };
2530078E137838D30074F3FD /* RKObjectMapper_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 2530078D137838D30074F3FD /* RKObjectMapper_Private.h */; settings = {ATTRIBUTES = (Public, ); }; };
253007A2137876770074F3FD /* OCHamcrestIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 253007A1137876770074F3FD /* OCHamcrestIOS.framework */; };
2537ABF31412A3B90043BE9F /* zend.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2537ABF21412A3B90043BE9F /* zend.xml */; };
2538C05C12A6C44A0006903C /* RKRequestQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 2538C05A12A6C44A0006903C /* RKRequestQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
2538C05D12A6C44A0006903C /* RKRequestQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 2538C05B12A6C44A0006903C /* RKRequestQueue.m */; };
253A08AF12551EA500976E89 /* Network.h in Headers */ = {isa = PBXBuildFile; fileRef = 253A08AE12551EA500976E89 /* Network.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -466,6 +467,7 @@
252CF8BF13E25FE00093BBD6 /* RKDynamicMappingModels.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RKDynamicMappingModels.m; sourceTree = "<group>"; };
2530078D137838D30074F3FD /* RKObjectMapper_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RKObjectMapper_Private.h; sourceTree = "<group>"; };
253007A1137876770074F3FD /* OCHamcrestIOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OCHamcrestIOS.framework; sourceTree = "<group>"; };
2537ABF21412A3B90043BE9F /* zend.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = zend.xml; sourceTree = "<group>"; };
2538C05A12A6C44A0006903C /* RKRequestQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RKRequestQueue.h; sourceTree = "<group>"; };
2538C05B12A6C44A0006903C /* RKRequestQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RKRequestQueue.m; sourceTree = "<group>"; };
253A07FC1255161B00976E89 /* libRestKitNetwork.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRestKitNetwork.a; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1344,6 +1346,7 @@
25B72A5713FBEDEE009A340D /* container_attributes.xml */,
25B72A5913FBF13B009A340D /* attributes_without_text_content.xml */,
25769F181409CC9C003FCDBC /* orders.xml */,
2537ABF21412A3B90043BE9F /* zend.xml */,
);
path = XML;
sourceTree = "<group>";
@@ -1998,6 +2001,7 @@
25B72A5813FBEDEE009A340D /* container_attributes.xml in Resources */,
25B72A5A13FBF13B009A340D /* attributes_without_text_content.xml in Resources */,
25769F191409CC9C003FCDBC /* orders.xml in Resources */,
2537ABF31412A3B90043BE9F /* zend.xml in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@@ -0,0 +1,27 @@
<?xml version="1.0"?>
<Api generator="zend" version="1.0">
<getList>
<map id_map="4">
<title><![CDATA[ Main World Map ]]></title>
<subtitle><![CDATA[ ]]></subtitle>
<description><![CDATA[ ]]></description>
</map>
<map id_map="3">
<title><![CDATA[ Section Map: Narshe Village ]]></title>
<subtitle><![CDATA[ ]]></subtitle>
<description><![CDATA[ ]]></description>
</map>
<map id_map="2">
<title><![CDATA[ Section Map: Gulgu Volcano Level 1 ]]></title>
<subtitle><![CDATA[ Kary lives here. ]]></subtitle>
<description><![CDATA[ ]]></description>
</map>
<map id_map="1">
<title><![CDATA[ Section Map: Dime Tower Level 4 ]]></title>
<subtitle><![CDATA[ Upper Floor ]]></subtitle>
<description><![CDATA[ ]]></description>
</map>
<total><![CDATA[ 4 ]]></total>
<status>success</status>
</getList>
</Api>

View File

@@ -135,4 +135,16 @@
}
}
- (void)itShouldParseXMLWithCDATA {
NSString *XML = RKSpecReadFixture(@"zend.xml");
RKXMLParserLibXML* parser = [[RKXMLParserLibXML new] autorelease];
NSDictionary *output = [parser parseXML:XML];
NSArray *map = [output valueForKeyPath:@"Api.getList.map"];
assertThat(map, isNot(nilValue()));
assertThat(map, hasCountOf(4));
assertThat([[map objectAtIndex:0] valueForKey:@"title"], is(equalTo(@"Main World Map")));
assertThat([[map objectAtIndex:1] valueForKey:@"title"], is(equalTo(@"Section Map: Narshe Village")));
assertThat([[map objectAtIndex:2] valueForKey:@"subtitle"], is(equalTo(@"Kary lives here.")));
}
@end