NSXMLParser заменяет символы на \ U00e9 - PullRequest
1 голос
/ 15 сентября 2011

Я использую парсер xml, NSXMLParser для анализа asn xml возврата url в NSMutableArray. Все замечательно, за исключением того факта, что french é заменен на \U00e9.

Вот мой код:

- (void)parseXMLFileAtURL:(NSString *)URL
{
    NSURL *xmlURL = [NSURL URLWithString:URL];

    xmlParser = [NSXMLParser alloc] initWithContentsOfURL:xmlURL];

    // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
    [xmlParser setDelegate:self];

    // Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
    [xmlParser setShouldProcessNamespaces:NO];
    [xmlParser setShouldReportNamespacePrefixes:NO];
    [xmlParser setShouldResolveExternalEntities:NO];

    [xmlParser parse];
}



- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{       

    currentElement = [elementName copy];
    if ([elementName isEqualToString:@"catalogue"]) {
        // clear out our story item caches...
        currentCatalogue = [[Catalogue alloc] init];
    }

    if ([elementName isEqualToString:@"partenaire"]) {
        // clear out our story item caches...
        currentPartenaire = [[Partenaire alloc] init];
    }
}

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     
        if ([elementName isEqualToString:@"catalogue"]) {       
            // Add currentCatalogue to array
            [catalogueList addObject: currentCatalogue];
            NSString *urls=[catalogueList valueForKey:@"url"];
        NSLog(@"Current catalogue: urls=%@", urls);
        }

        if ([elementName isEqualToString:@"partenaire"]) {      
            // Add currentPartenaire to array
            [partenaireList addObject: currentPartenaire];
            /*NSLog(@"Current partenaire: raison_sociale=%@, lat=%@, lng=%@", currentPartenaire.raison_sociale, currentPartenaire.lat, currentPartenaire.lng);*/
        }
    }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        // Catalogue setup
        if ([currentElement isEqualToString:@"id_model"])
            currentCatalogue.id_model = string;

        if ([currentElement isEqualToString:@"url"])
        {
            if (currentCatalogue.url)
            {
                currentCatalogue.url = [NSString stringWithFormat: @"%@%@", currentCatalogue.url, string];

             //   NSLog(@"Valoare url in data handler %@", currentCatalogue.url);
            }
            else
                currentCatalogue.url = string;


        }
    }

Кто-нибудь знает, как это исправить?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Если ваш XML имеет явную кодировку, как показано ниже:

 <?xml version="1.0" encoding="UTF-8"?>

, то есть две проблемы, которые вы должны решить в первую очередь.Это может или не может решить вашу прямую проблему, но если нет, то вам будет легче сузить проблему, которую вы видите.Вот проблемы, которые вы должны решить:

  1. Удалите код, который вызывает 2 разных метода инициализатора для одного экземпляра NSXMLParser.Это будет иметь неопределенные результаты, и будет невозможно узнать, что происходит, пока вы не исправите это.
  2. Измените способ реализации parser: foundCharacters: метод.Как говорится в документации NSXMLParser, это может вызываться несколько раз для данного набора символов в элементе XML.Вместо того, чтобы просто принять строку и сохранить ее значение, ваш класс делегата должен иметь изменяемый символьный буфер, который вы добавляете при каждом вызове foundCharacters.Затем в parser: didElementEnd вы можете получить содержимое буфера и сделать то, что вам нужно, с этим значением.

Попробуйте это с этими исправлениями и посмотрите, работает ли оно.Если нет, обновите свой пост исправленной версией кода, и в этом случае может быть более очевидно, в чем проблема.

0 голосов
/ 15 сентября 2011

ИСПЫТАННЫЙ КОД: 100% РАБОТАЕТ

NSString* inputString =[NSString stringWithFormat:@"\40_TTRS_Coup\u00e9_TTRS_Roadster_Tarifs_20110428.pdf"];


NSLog(@"inputString is: %@ \n\n",inputString);

ВЫВОД:

  inputString is:  _TTRS_Coupé_TTRS_Roadster_Tarifs_20110428.pdf 
...