スキップ(TLを; DRは:一番下に概要を参照してください。)NSXMLParserは、名前空間を持つ要素
私はRSS単一のサイトをオフフィードからコンテンツをプルアプリケーションを実装しています。ここではXMLのサンプルです:
<item>
<title>Title</title>
<link>http://example.com</link>
<comments>http://example.com/#comments</comments>
<pubDate>Thu, 26 Jan 2012 03:05:11 +0000</pubDate>
<dc:creator>Billy D. Author</dc:creator>
<category><![CDATA[sample_category]]></category>
<guid isPermaLink="false">http://example.com</guid>
<description><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras ac erat nec odio cursus accumsan. Nam feugiat hendrerit neque, nec tristique nisl ullamcorper vel. Nullam pellentesque augue metus. Vestibulum in lectus orci, eget ornare felis.…]]></description>
<content:encoded><![CDATA[<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras ac erat nec odio cursus accumsan. Nam feugiat hendrerit neque, nec tristique nisl ullamcorper vel. Nullam pellentesque augue metus. Vestibulum in lectus orci, eget ornare felis. Vestibulum nisl lacus, faucibus ac aliquet eu, pellentesque rutrum justo. Nulla fringilla venenatis augue a laoreet. Maecenas metus leo, euismod eget rutrum in, mattis eget nisi. Proin at massa sit amet odio tempor venenatis sit amet sit amet erat. Mauris vitae bibendum arcu. Curabitur a purus vitae ipsum ultricies luctus vel et velit.</p><p>Donec in lacus sit amet mi sagittis auctor eget nec nunc. Pellentesque adipiscing venenatis risus, a faucibus sem pretium quis. Nam fringilla metus eu nulla pellentesque semper. Quisque in lectus nisi. Fusce pretium accumsan purus nec sodales. Donec velit nisi, ullamcorper at faucibus vitae, lacinia quis dui. Duis eu dui leo, eget varius diam. Aliquam imperdiet volutpat tellus quis venenatis. Vivamus laoreet malesuada tincidunt. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris ut purus est. Sed quis mauris ut dolor dapibus vestibulum ut eu dolor. Cras interdum sagittis faucibus. Nulla tortor ligula, molestie at sollicitudin at, hendrerit et lacus. Nunc lorem enim, aliquet id porttitor ultrices, sodales ac sapien.</p>]]></content:encoded>
<wfw:commentRss>http://example.com/feed/</wfw:commentRss>
<slash:comments>0</slash:comments>
<enclosure url="http://example.com/some/other/stuff/>
</item>
私は、次の要素に興味があります:タイトル、リンク、pubDateの、DC:作成者、説明、コンテンツ:エンコードされました。
あなたが推測しているように、タイトル、リンク、pubDateと説明はうまくいきます。しかし、dc:creatorのコンテンツの代わりに、私はpubDateのコンテンツを取得し、コンテンツの代わりに:encoded、私は説明を取得します。私のパーサー・オブジェクトの
、私は
[xmlParser setDelegate:self];
[xmlParser setShouldProcessNamespaces: YES];
[xmlParser setShouldReportNamespacePrefixes:YES];
[xmlParser setShouldResolveExternalEntities:YES];
を持っているし、次のメソッドを実装している:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
// NSLog(@"element %@, ns %@, qn %@", elementName, namespaceURI, qName);
if ([elementName isEqualToString:@"rss"]) {
return;
}
if ([elementName isEqualToString:@"channel"]) {
// begin the set of entries
if (!allEntries)
allEntries = [NSMutableArray array];
return;
}
if ([elementName isEqualToString:@"item"]) {
// item means a new post!
// currentPost = [[DIDSEntry alloc] init];
return;
}
if ([elementName isEqualToString:@"title"]) {
[self setCurrentProperty:@"title"];
currentPostTitle = [NSString string];
return;
}
if ([elementName isEqualToString:@"link"]) {
[self setCurrentProperty:@"url"];
currentPostUrl = [[NSURL alloc] init];
return;
}
if ([elementName isEqualToString:@"pubDate"]) {
[self setCurrentProperty:@"date"];
currentPostDate = [[NSDate alloc] init];
return;
}
if ([elementName isEqualToString:@"dc:creator"]) {
[self setCurrentProperty:@"author"];
currentPostAuthor = [NSString string];
return;
}
if ([elementName isEqualToString:@"description"]) {
[self setCurrentProperty:@"preview"];
currentPostPreview = [NSString string];
return;
}
if ([elementName isEqualToString:@"content:encoded"]) {
[self setCurrentProperty:@"text"];
currentPostText = [NSString string];
return;
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentStringValue) {
// currentStringValue is an NSMutableString instance variable
currentStringValue = [[NSMutableString alloc] initWithCapacity:50];
}
[currentStringValue appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"rss"]) {
return;
}
if ([elementName isEqualToString:@"channel"]) return;
if ([elementName isEqualToString:@"item"]) {
currentPost = [[DIDSEntry alloc] initWithPostTitle:currentPostTitle postAuthor:currentPostAuthor postUrl:currentPostUrl pubDate:currentPostDate postPreview:currentPostPreview postText:currentPostPreview];
[allEntries addObject:currentPost];
return;
}
NSString *prop = [self currentProperty];
if ([prop isEqualToString:@"title"]) {
[self setCurrentPostTitle:currentStringValue];
// return;
}
if ([prop isEqualToString:@"url"]) {
[self setCurrentPostUrl:[NSURL URLWithString:currentStringValue]];
// return;
}
if ([prop isEqualToString:@"date"]) {
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss ZZZ"];
[self setCurrentPostDate:[formatter dateFromString:currentStringValue]];
// NSLog(@"date: %@", currentStringValue);
}
if ([prop isEqualToString:@"author"]) {
[self setCurrentPostAuthor:currentStringValue];
// return;
}
if ([prop isEqualToString:@"preview"]) {
[self setCurrentPostPreview:currentStringValue];
// return;
}
if ([prop isEqualToString:@"text"]) {
[self setCurrentPostText:currentStringValue];
// return;
}
// currentStringValue is an instance variable
currentStringValue = nil;
return;
}
また、私は一種の
- (void)parser:(NSXMLParser *)parser didStartMappingPrefix:(NSString *)prefix toURI:(NSString *)namespaceURI
と
を実装しました- (void)parser:(NSXMLParser *)parser didEndMappingPrefix:(NSString *)prefix
しかし、私は彼らがどうしたらいいのか分からないので、彼らが呼び出されていることを記録するだけです。
なぜ私のコードがこのように動作し、どのように修正するかもしれないのかを解明しようとしていますが、私は完全に迷っています。私は要素名の代わりに修飾された名前のテストを試みました、接頭辞を取り除くこと、および他のいくつかの事柄がありましたが、喜びはありません。 (私が見てきたすべてが本当に私が後だものを取り上げていないのに、私はまた、唯一の表面的に、XML名前空間を理解しています。)合計で
:
は、名前空間を持つ要素を解析し、その内容を保存しようとすると、インスタンス変数では、以前に解析された要素がそれらのivarsに格納されます。私はなぜそれが事実であり、どうやって修正できるのか分かりません。