2012-01-26 3 views
0

을 가진 요소 건너 뜁니다 (TL을, 박사는 : 맨 아래에 요약을 참조하십시오.) 나는 하나의 사이트를 먹이의 RSS 컨텐츠를 끌어 응용 프로그램을 구현하고NSXMLParser 네임 스페이스

. 나는 다음과 같은 요소에 관심이

<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> 

: 여기에는 XML의 샘플입니다 제목, 링크, pubDate의, 직류 : 제작자, 설명, 내용 : 인코딩.

예상대로 제목, 링크, 게시일 및 설명이 잘 풀립니다. 그러나 dc : creator의 내용 중 하나 대신 pubDate의 내용을 가져오고 내용 대신 : 인코딩되어 설명을 얻습니다.

내 파서 객체의 경우

, 나는

[xmlParser setDelegate:self]; 

[xmlParser setShouldProcessNamespaces: YES]; 
[xmlParser setShouldReportNamespacePrefixes:YES]; 
[xmlParser setShouldResolveExternalEntities:YES]; 

이 다음과 같은 방법을 구현 한 : 나는 또한 가지

- (void)parser:(NSXMLParser *)parser didStartMappingPrefix:(NSString *)prefix toURI:(NSString *)namespaceURI 

을 구현했습니다

- (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 didEndMappingPrefix:(NSString *)prefix 

그러나 나는 그들이 내가 그들과해야 할 일을 모르기 때문에 그들이 호출되고 있다는 것을 기록 만 남습니다.

저는 왜 웹 코드가 이런 식으로 행동하는지, 어떻게 해결할 수 있는지에 대한 답변을 찾으려고 노력하고 있지만 완전히 실망합니다. 필자는 요소 이름 대신 정규화 된 이름에 대한 테스트를 시도했지만 접두어를 사용하지 않았습니다.

네임 스페이스와 요소를 구문 분석을 시도하고 내용을 저장 : 요약에서

(. 또한 표면적으로 내가 본 모든 것이 정말 난 후 무엇을 해결하지 불구하고, XML 네임 스페이스를 이해) 인스턴스 변수에서 이전에 구문 분석 된 요소가 해당 ivars에 저장됩니다. 나는 그것이 왜 그런지, 어떻게 고칠 수 있는지 전혀 모른다.

답변

1

해결되었습니다. 용서해주세요.하지만이 게시물은 네임 스페이스에만 접하게 관련된 것 같습니다. 내가 않았다면 내가 그들을 확인하고, 각 사용 후 nil로 currentProperty 문자열을 설정하고 내가 currentPostPreview에 postText를 설정했다는 것을 알았을 때 요소 이름 앞에서 네임 스페이스 접두사를 사용 했습니까? 죄송합니다. 늦었 어.

관련 문제