gpt4 book ai didi

xml - NSXMLParser 跳过具有 namespace 的元素

转载 作者:行者123 更新时间:2023-12-03 17:59:18 25 4
gpt4 key购买 nike

(tl;博士:请参阅底部的摘要。)

我正在实现一个从单个站点的 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.&#8230;]]></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:creator、描述、内容:编码。

正如您可能猜到的那样,标题、链接、pubDate 和描述都很好。但是我得到的不是 dc:creator 的任何内容,而是 pubDate 的内容,并且我得到的是描述,而不是 content: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 中。我不知道为什么会出现这种情况以及如何解决。

最佳答案

已解决。请原谅我,但显然这篇文章与命名空间无关。当我检查元素名称时,我确实将命名空间前缀从元素名称中去掉,每次使用后将 currentProperty 字符串设置为 nil,并注意到我将 postText 设置为 currentPostPreview。对不起。已经晚了。

关于xml - NSXMLParser 跳过具有 namespace 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9014868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com