从.XSD模板生成的XML文件生成下面粘贴的输出。由于 category
的密钥为 image
,因此解析image
项的标准方式无法在category
上运行。我想将 category name="Category #"
放入数组中,如何从类别字段中创建数组。
我想要的是一系列词典。每个位置都包含一个代表一个类别的字典,每个字典都包含该类别的图像。
Array: @"Category 1",@"Category 2",@"Category 3";
之间的所有内容
For each Array, a Dictionary with: <image>
以及介于</image>
基本上,我需要从XML数据源创建类似下图的plist
<?xml version="1.0" encoding="UTF-8"?>
<app xmlns="http://www.wrightscs.com/_xml_.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.wrightscs.com/_xml_.xsd" name="Testing" unlock_product_id="com.wrightscs.all">
<bannerImg>http://www.wrightscs.com</bannerImg>
<category name="Category 1" icon="http://www.wrightscs.com">
<image>
<title>title</title>
<thumbUrl>http://www.wrightscs.com</thumbUrl>
<sampleUrl>http://www.wrightscs.com</sampleUrl>
<imageUrl>http://www.wrightscs.com</imageUrl>
<description>These items / keys not an issue.</description>
<infoUrl>http://www.wrightscs.com</infoUrl>
<license>http://www.wrightscs.com</license>
<licenseUrl>http://www.wrightscs.com</licenseUrl>
</image>
</category>
<category name="Category 2" icon="http://www.wrightscs.com">
<image>
<title>title</title>
<thumbUrl>http://www.wrightscs.com</thumbUrl>
<sampleUrl>http://www.wrightscs.com</sampleUrl>
<imageUrl>http://www.wrightscs.com</imageUrl>
<description>These items / keys not an issue.</description>
<infoUrl>http://www.wrightscs.com</infoUrl>
<license>http://www.wrightscs.com</license>
<licenseUrl>http://www.wrightscs.com</licenseUrl>
</image>
</category>
<category name="Category 3" icon="http://www.wrightscs.com">
<image>
<title>title</title>
<thumbUrl>http://www.wrightscs.com</thumbUrl>
<sampleUrl>http://www.wrightscs.com</sampleUrl>
<imageUrl>http://www.wrightscs.com</imageUrl>
<description>These items / keys not an issue.</description>
<infoUrl>http://www.wrightscs.com</infoUrl>
<license>http://www.wrightscs.com</license>
<licenseUrl>http://www.wrightscs.com</licenseUrl>
</image>
</category>
</app>
注意:没有其他项/键是一个问题,我只对将类别变成数组感兴趣。此示例中的网址也会替换为原始内容。
答案 0 :(得分:1)
看看xpath和这个:http://blog.objectgraph.com/index.php/2010/02/24/parsing-html-iphone-development/
在这种情况下,您需要的xpath是
//类别/ @名称
这与上面提到的库应该返回数组中的类别名称。
有关更多xpath语法,请查看:http://www.w3schools.com/xpath/default.asp
答案 1 :(得分:0)
#pragma mark -
#pragma mark Delegate Received
-(void)parsingComplete:(XMLDataSource*)theParser {
NSArray *categoryArray = [theParser getCategories];
[categoryArray writeToFile:PLIST atomically:YES];
}
- (void)receivedItems:(NSArray *)theItems {
NSMutableArray *dataItems = [[NSMutableArray alloc] init];
[dataItems addObjectsFromArray:[NSArray arrayWithContentsOfFile:PLIST]];
NSDictionary * dataItem = [dataItems objectAtIndex:categoryIndex];
data_ = [dataItem objectForKey:@"images"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"updateThumbs" object:nil];
}
#pragma mark -
#pragma mark Parsing Delegates
- (void)parse:(NSData *)data withDelegate:(id)sender onComplete:(SEL)callback
{
parentDelegate = sender;
onCompleteCallback = callback;
loading = YES;
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
parsed = NO;
loading = NO;
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSString *element = [elementName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
currentElement = element;
if ([[currentElement lowercaseString] isEqual:@"image"]) {
inImage = YES;
itemsDictionary = [[NSMutableDictionary alloc] init];
[itemsDictionary addEntriesFromDictionary:attributeDict];
}
if ([[currentElement lowercaseString] isEqual:@"category"]) {
inCategory = YES;
categoryDictionary = [[NSMutableDictionary alloc] init];
[categoryDictionary addEntriesFromDictionary:attributeDict];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
NSString *element = [elementName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([[element lowercaseString] isEqual:@"image"]) {
inImage = NO;
[items addObject:[itemsDictionary copy]];
}
if ([[element lowercaseString] isEqual:@"category"]) {
inCategory = NO;
[categoryDictionary setObject:[items copy] forKey:@"images"];
[items removeAllObjects];
[categories addObject:[categoryDictionary copy]];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSString *stringValue = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString *element = [currentElement stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
/* skip over blank elements. */
if (stringValue == nil || [stringValue isEqual:@""]) {
return;
}
if (element != nil && [element length] > 0) {
if (inImage) {
if ([itemsDictionary objectForKey:element] != nil) {
[itemsDictionary setObject:[NSString stringWithFormat:@"%@%@", [itemsDictionary objectForKey:element], stringValue]
forKey:element];
} else {
[itemsDictionary setObject:stringValue forKey:element];
}
} else if ((!inImage) && (inCategory)) {
if ([categoryDictionary objectForKey:element] != nil) {
[categoryDictionary setObject:[NSString stringWithFormat:@"%@%@", [categoryDictionary objectForKey:element], stringValue]
forKey:element];
} else {
[categoryDictionary setObject:stringValue forKey:element];
}
} else {
if ([root objectForKey:element] != nil) {
[root setObject:stringValue forKey:element];
}
}
}
}
- (void)parserDidStartDocument:(NSXMLParser *)parser {
NSError * err;
if(![[NSFileManager defaultManager] fileExistsAtPath:PLIST]) {
[[NSFileManager defaultManager] removeItemAtPath:PLIST error:&err];
}
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
parsed = YES;
loading = NO;
if ([parentDelegate respondsToSelector:onCompleteCallback]) {
[parentDelegate performSelector:onCompleteCallback withObject:self];
}
if ([self respondsToSelector:@selector(receivedItems:)])
[self receivedItems:items];
else
SHOW_ALERT(@"parserDidEndDocument:", @"receivedItems: not responding!", nil, @"Okay", nil)
}
#pragma mark -
#pragma mark Setters / Getters
- (id)delegate {
return self;
}
- (void)setDelegate:(id)new_delegate {
_delegate = self;
}
- (BOOL)isSuccessful {
return success;
}
- (BOOL)isLoading {
return loading;
}
- (BOOL)isParsed {
return parsed;
}
- (NSArray *)getCategories {
return categories;
}
- (NSDictionary *)getRoot {
return root;
}
- (void)dealloc {
[super dealloc];
}