1

アプリでxmlフィードを解析しようとしています...xmlファイルはこのURLにあります

feeds.feedburner.com/blogspot/TUvAW?format=xml

問題は、説明セグメントにアクセスすると、引用符などのさまざまな特殊記号が表示されることです。これは、私のxmlから解析しようとしている記述セグメントの1つです。

<description>Este es mi blog 3&lt;img src="http://feeds.feedburner.com/~r/blogspot/TUvAW/~4/URCV9ModTR0" height="1" width="1"/&gt;</description>

NSXMLParserで解析すると、次のようになります。

XMLParser.m

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementname isEqualToString:@"item"])
    {
        currentFeed = [Feed alloc];
        isStatus = YES;
    }
    if ([elementname isEqualToString:@"author"])
    {
        isStatus = NO;
    }
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if (isStatus)
    {
        if ([elementname isEqualToString:@"description"])
        {
            currentFeed.description = currentNodeContent;
            NSLog(@"%@",currentNodeContent);

        }
        if ([elementname isEqualToString:@"title"])
        {
            currentFeed.content = currentNodeContent;
            NSLog(@"%@",currentNodeContent);

        }
        if ([elementname isEqualToString:@"link"])
        {
            currentFeed.WVUrl = currentNodeContent;
            NSLog(@"%@",currentNodeContent);
        }
    }
    if ([elementname isEqualToString:@"item"])
    {
        [self.feeds addObject:currentFeed];
        currentFeed = nil;
        currentNodeContent = nil;
    }
}

これらのNSLogを使用して、解析から取得した文字列を追跡していますが、説明ノードのコンテンツは常にこれだけを示しています:>タイトルノードとリンクノードは完全に表示されています。

説明ノードからすべての文字列を取得して後で使用したいのですが、単純にできません。これで何が問題になっているのかわかりません。

4

2 に答える 2

1

問題は、Abhishek、Rob、および私によって概説されています。しかし、それを要約して正しい解決策を示すことは価値があると思います。

主な問題は、タグparser:foundCharacters:が何度も呼び出され、各呼び出しが説明の一部を提供することです。<description>

解決策は、ピースを連結することです。

XMLParser.h:

NSMutableString* currentNodeContent;

XMLParser.m:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (currentNodeContent == nil)
        currentNodeContent = [[NSMutableString alloc] initWithCapacity: 20];
    [currentNodeContent appendString: [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementname isEqualToString:@"item"])
    {
        currentFeed = [Feed alloc];
        isStatus = YES;
    }
    if ([elementname isEqualToString:@"author"])
    {
        isStatus = NO;
    }
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if (isStatus)
    {
        if ([elementname isEqualToString:@"description"])
        {
            currentTweet.description = currentNodeContent;
            NSLog(@"%@",currentNodeContent);

        }
        if ([elementname isEqualToString:@"title"])
        {
            currentTweet.content = currentNodeContent;
            NSLog(@"%@",currentNodeContent);

        }
        if ([elementname isEqualToString:@"link"])
        {
            currentFeed.WVUrl = currentNodeContent;
            NSLog(@"%@",currentNodeContent);
        }
    }
    if ([elementname isEqualToString:@"item"])
    {
        [self.feeds addObject:currentFeed];
        currentFeed = nil;
        [currentNodeContent release];
        currentNodeContent = nil;
    }
}
于 2013-01-01T23:11:05.093 に答える
0

Xmlファイルの問題は、「&」文字の使用です。

これを行うには、1つの文字列でxmlデータを取得し、「&」を任意の一意の文字列に置き換えてから、xmlを解析します。

xmlデータを表示または使用しているときに、取得している文字列に同じ一意の文字列が含まれているかどうかを確認し、その文字列を「&」に置き換えます。

于 2013-01-01T19:42:11.040 に答える