10

URLからxmlを解析するためにNSXMLParserを使用しています(私のコードはこことほぼ同じです

一部の要素には、「á」などの特殊文字が含まれており、これにより、単語 lik ándre が 2 つ (á と ndre) に分割されます。

これが私のloadXMLByURLです

-(id) loadXMLByURL:(NSString *)urlString{
tickets     = [[NSMutableArray alloc] init];
NSURL *url      = [NSURL URLWithString:urlString];
NSData  *data   = [[NSData alloc] initWithContentsOfURL:url];
parser          = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;}

エンコーディングが設定されていないためだと確信していますが(NSUTF8StringEncodingである必要があると思います)、どこに/どのように適用するかわかりません。

[更新]私のコードの残りの部分...

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{    
    if ([elementname isEqualToString:@"ticket"]) 
    {
        currentTicket = [Ticket alloc];
    }

}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementname isEqualToString:@"name"]) 
    {
        currentTicket.name = currentNodeContent;
    }
    else if ([elementname isEqualToString:@"title"]) 
    {
        currentTicket.title = currentNodeContent;
    }
    else if ([elementname isEqualToString:@"status"]) 
    {
        currentTicket.status = currentNodeContent;
    }
    else if ([elementname isEqualToString:@"ticket"])
    {
        [tickets addObject:currentTicket];
        [currentTicket release];
        currentTicket = nil;
        [currentNodeContent release];
        currentNodeContent = nil;
    }

}

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

[更新 2] サンプル xml...

<RB>
    <list>
        <ticket>
            <name>Andrew Ford</name>
            <title>3rd release</title>
            <status>1</status>
        </ticket>

        <ticket>
            <name>David Jenkins</name>
            <title>3rd release</title>
            <status>0</status>
        </ticket>

        <ticket>
            <name>Luis gomez ándre</name>
            <title>3rd release</title>
            <status>1</status>
        </ticket>
    </list>
</RB>
4

3 に答える 3

6

URLをにロードしてから、NSString このように変換します。

-(id) loadXMLByURL:(NSString *)urlString{

    tickets     = [[NSMutableArray alloc] init];
    NSURL *url      = [NSURL URLWithString:urlString];
    NSError *error;
    NSString * dataString = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
    parser          = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    [parser parse];
    return self;

}

編集:問題の一部は、メソッドが追加ではなくparser:foundCharacters:割り当てられている可能性があります。currentNodeContent次のリンクにある Apple Doc を参照してください。

http://developer.apple.com/library/ios/#documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html

ドキュメントから:

string は現在の要素の文字コンテンツ全体の一部にすぎない可能性があるため、要素が変更されるまで、現在の文字の蓄積に追加する必要があります。

于 2012-04-21T00:22:46.447 に答える
4

問題を発見!それは確かに見つかった文字にあります。コードを次のように変更する必要があります。

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"found characters: %@", string);
    if (!currentNodeContent) {
        currentNodeContent = [[NSMutableString alloc] init];
    }
    [currentNodeContent appendString:string];
}

以前も同じ問題がありましたが、上記のコードで修正されました。

于 2014-12-16T00:41:54.937 に答える
1

使用する

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];

そこから文字列を取得するには、次のようにします。

NSString *theXML = [[NSString alloc] initWithBytes:[data mutableBytes]
                                                    length:[data length]
                                                 encoding:NSUTF8StringEncoding];

次に、NSXMLParserDelegateメソッドでxmlを解析できます。

お役に立てれば。

于 2012-04-25T20:16:43.987 に答える