Problemas com Parse XML - Iphone

2019-03-03 11:50发布

English translation not by OP. Original follows.

Gentleman,

I'm connecting to a web server and getting an XML file that has the following format:

<?xml version="1.0" encoding="ISO-8859-1"?>
<programacao>
<agenda>
<data>17/02</data>
<cidade>Barueri</cidade>
<estado>SP</estado>
</agenda>
<agenda>
<data>19/02</data>
<cidade>Maringá</cidade>
<estado>PR</estado>
</agenda>
<agenda>
<data>17/03</data>
<cidade>Cubatão</cidade>
<estado>SP</estado>
</agenda>
</programacao>

So far so good. But when I try parsing it like so:

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

- (void)parser:(NSXMLParser *)parser didStartElement:(NSMutableString
*)elementName
 namespaceURI:(NSMutableString *)namespaceURI qualifiedName:
(NSMutableString *)qName attributes:(NSDictionary *)attributeDict
{
       if ([elementName isEqualToString:@"agenda"])
       {
               currentEvento = [Agenda alloc];
               currentNodeContent = [[NSMutableArray alloc] init];
       }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSMutableString
*)elementName namespaceURI:(NSMutableString *)namespaceURI
qualifiedName:(NSMutableString *)qName
{
       if ([elementName isEqualToString:@"agenda"])
       {
               [minhaAgenda addObject:currentEvento];
               [currentEvento release];
               currentEvento = nil;
               [currentNodeContent release];
               currentNodeContent = nil;
       }

   if ([elementName isEqualToString:@"cidade"])
   {
           currentEvento.cidade = currentNodeContent;
   }

   if ([elementName isEqualToString:@"estado"])
   {
           currentEvento.estado = currentNodeContent;
   }

   if ([elementName isEqualToString:@"data"])
   {
           currentEvento.data = currentNodeContent;
   }
}

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

    NSLog(@"%@", currentNodeContent);
}

... words with accents get truncated. I get several line breaks in the Log... like the word Cubatão shows as Cubat on one line and ão in the next, or Maringá becomes Maring on one and á in the next.

I tried a lot of different things but when I put them in a table view all I get are the chopped pieces. What can I do to solve this problem?


Original

Senhores,

Estou realizando um conexão em um servidor web, acessando um arquivo XML no seguinte formato:

<?xml version="1.0" encoding="ISO-8859-1"?>
<programacao>
<agenda>
<data>17/02</data>
<cidade>Barueri</cidade>
<estado>SP</estado>
</agenda>
<agenda>
<data>19/02</data>
<cidade>Maringá</cidade>
<estado>PR</estado>
</agenda>
<agenda>
<data>17/03</data>
<cidade>Cubatão</cidade>
<estado>SP</estado>
</agenda>
</programacao>

Até aí tudo ok.. acontece que quando faço o parser com o seguinte:

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

- (void)parser:(NSXMLParser *)parser didStartElement:(NSMutableString
*)elementName
 namespaceURI:(NSMutableString *)namespaceURI qualifiedName:
(NSMutableString *)qName attributes:(NSDictionary *)attributeDict
{
       if ([elementName isEqualToString:@"agenda"])
       {
               currentEvento = [Agenda alloc];
               currentNodeContent = [[NSMutableArray alloc] init];


       }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSMutableString
*)elementName namespaceURI:(NSMutableString *)namespaceURI
qualifiedName:(NSMutableString *)qName
{
       if ([elementName isEqualToString:@"agenda"])
       {
               [minhaAgenda addObject:currentEvento];
               [currentEvento release];
               currentEvento = nil;
               [currentNodeContent release];
               currentNodeContent = nil;

       }

   if ([elementName isEqualToString:@"cidade"])
   {
           currentEvento.cidade = currentNodeContent;
   }

   if ([elementName isEqualToString:@"estado"])
   {
           currentEvento.estado = currentNodeContent;
   }

   if ([elementName isEqualToString:@"data"])
   {
           currentEvento.data = currentNodeContent;
       }



}

    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString
    *)string
    {

       currentNodeContent = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];

       NSLog(@"%@", currentNodeContent);

}

As palavras acentuadas ficam truncadas.. vejo quebradas em várias linhas no Log... tipo Cubat na outra linha ão... Maring e na outra linha á

Já tentei vários recursos, mas quando jogo na Table View as palavras acentuadas só ficam os pedaços. O que posso fazer para resolver esse problema?

2条回答
Luminary・发光体
2楼-- · 2019-03-03 12:05

I do not speak Portuguese but I do speak Spanish so I think I understand some of your problems.

You would be much better of using a wrapper library for parsing XMLs called TouchXML.

It is very easy to use, if you need more information leave a comment.

查看更多
做个烂人
3楼-- · 2019-03-03 12:19

In -(void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString *)string you're setting the currentNodeContent to the string. I believe you'd want to append string to the currentNodeContent instead of replacing it.


Portuguese translation

No método -(void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString *)string você está setando o currentNodeContent para o que vem na string, mas fazendo isso você perde o que já estava lá antes. Provavelmente esse método é chamado separado quando o parser acha um acento, por isso que os pedaços ficam separados. Você deveria fazer um append do currentNodeContent com a string ao invés de substituir o que já tinha antes.

查看更多
登录 后发表回答