iOS で属性付き XML の解析に行き詰まっています。
XML
<?xml version="1.0" encoding="UTF-8"?>
<Books>
<Book id="1">
<title_1>Circumference</title_1>
<author>Nicholas Nicastro</author>
<summary>Eratosthenes and the Ancient Quest to Measure the Globe.</summary>
</Book>
<Book id="2">
<title_1>Copernicus Secret</title_1>
<author>Jack Repcheck</author>
<summary>How the scientific revolution began</summary>
</Book>
<Book id="3">
<title_1>Angels and Demons</title_1>
<author>Dan Brown</author>
<summary>Robert Langdon is summoned to a Swiss research facility to analyze a cryptic symbol seared into the chest of a murdered physicist.</summary>
</Book>
<Book id="4">
<title_1>Keep the Aspidistra Flying</title_1>
<author>George Orwell</author>
<summary>A poignant and ultimately hopeful look at class and society, Keep the Aspidistra Flying pays tribute to the stubborn virtues of ordinary people who keep the aspidistra flying.</summary>
</Book>
</Books>
コード
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict {
if([elementName isEqualToString:@"Books"])
{
data_array = [[NSMutableArray alloc] init];
}
else if([elementName isEqualToString:@"Book"])
{
bookID= [[attributeDict objectForKey:@"id"]integerValue];
NSLog(@"Reading id value :%d",bookID);
//NSLog(@"Processing Element: %@",elementName);
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if(!test_string)
{
test_string = [[NSMutableString alloc] initWithString:string];
}
else
{
[test_string appendString:string];
}
//NSLog(@"Processing Value: %@",test_string);
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"Books"])
return;
if ([elementName isEqualToString:@"Book"])
{
[data_array addObject:test_string];
}
else
test_string = nil;
}
このアプローチに従うと、最初の本はスキップされ、最後の 3 冊だけが表示されます。
test_string=nil
else ではなく if ブロックを使用すると、作成者名も表示されます
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"Books"])
return;
if ([elementName isEqualToString:@"Book"])
{
[data_array addObject:test_string];
test_string = nil;
// data_array = nil;
}
}
さらに、テーブル ビューに表示されるときに、いくつかのスペースも表示されます。