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?
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.
In
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString *)string
you're setting thecurrentNodeContent
to thestring
. I believe you'd want to appendstring
to thecurrentNodeContent
instead of replacing it.Portuguese translation
No método
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString *)string
você está setando ocurrentNodeContent
para o que vem nastring
, 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 docurrentNodeContent
com astring
ao invés de substituir o que já tinha antes.