【问题标题】:NSXMLParser strange behavior with \nNSXMLParser 的奇怪行为与 \n
【发布时间】:2012-01-19 12:52:15
【问题描述】:

我正在开发一个解析 XML 文件的 iOS 4 应用程序。一段XML是:

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

我使用下面的方法来解析&lt;name lang="es"&gt;The Mad&lt;/name&gt;

#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 格式。

【问题讨论】:

  • 你能展示你对 didStartElement 和 didEndElement 的实现吗?
  • 您是如何创建输入此解析器的 XML 字符串的?您是否有可能在解析之前将输入 XML 中的换行符转换为实际的 '\' 'n' 字符?
  • 我所有的代码都在这里。我遵循了本指南:developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…

标签: ios xml nsxmlparser file-format


【解决方案1】:

foundCharacters 委托方法也被调用以获取元素之间的空白。如果&lt;cards&gt;&lt;card id=... 之间有换行符,它将被调用。

我建议清除didStartElement 顶部的currentStringValue 以丢弃在当前元素开始之前找到的所有字符,并确保foundCharacters 仅捕获当前元素内的字符(而不是介于两者之间)。

didStartElement的顶部,添加:

[currentStringValue release];
currentStringValue = nil;


元素的值可能包含空格(因此在 didEndElement 中删除它们可能会导致保存与 xml 内容不匹配的值)。

【讨论】:

  • 如果使用 currentStringValue 作为 NSMutableArray。我们怎样才能做到这一点?
【解决方案2】:

在您的结束元素方法中,您可以尝试自己从当前文本字符串中删除这些内容。只需尝试在字符串上搜索它们并将它们替换为@""。我喜欢替换这些和不需要的空白条目。

【讨论】:

    【解决方案3】:

    试试这个对我有用,

    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];
      }
     }
    

    希望这对某些人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2020-06-18
      • 2021-10-30
      • 2022-01-20
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多