NSXMLParser странное поведение с \ n - PullRequest
1 голос
/ 13 декабря 2011

Я разрабатываю приложение для iOS 4, которое анализирует XML-файл. Кусок XML:

<?xml version="1.0" encoding="utf-8" ?>
<cards>
  <card id ="0">
    <name lang="es">The Mad</name>
    <description lang="es">...</description>
  </card>
...
</cards>

Я использую следующий метод для разбора <name lang="es">The Mad</name>.

#pragma mark -
#pragma mark NSXMLParserDelegate methods

- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict
{
    NSLog(@"DidStartElement: %@", elementName);
    if ([elementName isEqualToString:@"card"])
    {
        currentCard = [[Card alloc] init];
        NSString* arcaneNumber = [attributeDict objectForKey:@"id"];
        currentCard.Number = arcaneNumber;

        return;
    }
    if ([elementName isEqualToString:@"name"])
    {
        if ([[attributeDict objectForKey:@"lang"] isEqualToString:userLanguage])
        {
            currentProperty = kNameProperty;
            return;
        }
    }
    if ([elementName isEqualToString:@"description"])
    {
        if ([[attributeDict objectForKey:@"lang"] isEqualToString:userLanguage])
        {
            currentProperty = kDescriptionProperty;
            return;
        }
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (!currentStringValue)
    {
        // currentStringValue is an NSMutableString instance variable
        currentStringValue = [[NSMutableString alloc] initWithCapacity:50];
    }
    [currentStringValue appendString:string];
}

- (void) parser:(NSXMLParser *)parser
  didEndElement:(NSString *)elementName
   namespaceURI:(NSString *)namespaceURI
  qualifiedName:(NSString *)qName
{
    NSLog(@"DidEndElement: %@", elementName);
    if ([elementName isEqualToString:@"card"])
    {
        [cards setObject:currentCard forKey:currentCard.Number];
        [currentCard release];
        currentCard = nil;

        return;
    }

    if (currentProperty == kNameProperty)
    {
        currentProperty = kNoneProperty;
        currentCard.Name = [currentStringValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        [currentStringValue release];
        currentStringValue = nil;

        return;
    }

    if (currentProperty == kDescriptionProperty)
    {
        currentProperty = kNoneProperty;
        currentCard.Description = currentStringValue;
        [currentStringValue release];
        currentStringValue = nil;

        return;
    }
}

После разбора я получаю на currentStringValue следующее:

\n\nThe Mad

Как можно избежать этих двух '\ n'? Почему я получаю эти два '\ n'?

Этот xml-файл пришел из системы Windows, и я использовал TextWrangler, чтобы преобразовать его в формат Classic Mac.

Ответы [ 3 ]

7 голосов
/ 13 декабря 2011

Метод делегата foundCharacters также вызывается для пробелов между элементами.Он будет вызван, если, скажем, будет новая строка между <cards> и <card id=....

. Я предлагаю очистить currentStringValue в верхней части didStartElement, чтобы отбросить любые символы, найденные до начала текущего элемента.и чтобы foundCharacters.

в верхней части didStartElement добавили:

[currentStringValue release];
currentStringValue = nil;


, чтобы только символы внутри текущего элемента (не между ними) были захвачены.Возможно, что значение элемента содержит пробелы (поэтому удаление их в didEndElement может привести к сохранению значений, которые не соответствуют содержимому xml).

0 голосов
/ 01 октября 2018

Попробуйте, у меня все получится,

NSString *data= [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Используйте строчку кода выше в методе foundCharacters .

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

  if(dString == nil){
   dString = [[NSMutableString alloc] initWithString:data];
 }else
  {
   [dString appendString:data];
  }
 }

Надеюсь, это поможет кому-нибудь.

0 голосов
/ 13 декабря 2011

В вашем методе конечного элемента вы можете попробовать удалить их из текущей текстовой строки.Просто попробуйте найти их в строке и замените их на @ "".Мне нравится заменять эти и ненужные пустые записи.

...