【问题标题】:NSScanner & Array LoopsNSScanner 和数组循环
【发布时间】:2011-01-28 18:22:03
【问题描述】:

我正在尝试使用 NSScanner 是一个 NSArray 枚举循环。然而这失败了:

-[NSXMLElement length]: 无法识别的选择器发送到实例 0x280da30

不,我不会在任何地方打电话给length。似乎 found 的值在扫描仪完成之前已更改,因此将其变为空白,从而导致 length 错误。

如果我删除循环并对字符串进行硬编码(我不想这样做,这只是一个测试),下面的代码就可以工作。 (当然不包括枚举)

它也永远不会调用NSLogs...

这是我的代码:

    for (NSString*found in arr)
    {
        NSLog(@"Found %@",found);

        NSString*search = [NSString stringWithString:found];

        NSString *separatorString = @"\"";                             
        NSString *container = nil;
        NSScanner *aScanner = [NSScanner scannerWithString:search]; 

        [aScanner setScanLocation:0];                                        
        [aScanner scanUpToString:@"src=\"" intoString:nil];          
        [aScanner scanString:@"src=\"" intoString:nil];                     
        [aScanner scanUpToString:separatorString intoString:&container]; 

        NSLog(@"scanned");

        NSLog(@"%@",container);

        NSImage*previewImage = [[NSImage alloc] initWithContentsOfFile:[relativeDir stringByAppendingPathComponent:container]];

        [preview setImage:previewImage];

        [previewImage release];

        progressed = progressed + 1;

        [convertProgress setDoubleValue:[convertProgress doubleValue] + progressed];
    }

我怎样才能让它工作?

编辑:

这是输入:

    NSXMLDocument*doc = [[NSXMLDocument alloc] initWithData:[NSData dataWithContentsOfFile:webPath] options:NSXMLDocumentTidyHTML error:nil];

    NSArray*arr = [doc nodesForXPath:@"//img[@src]" error:nil];

【问题讨论】:

  • 了解输入内容可能会有所帮助...
  • 顺便说一下,扫码可以很好地用于简单的输入。
  • 我已经说过它适用于简单的输入。

标签: objective-c cocoa nsscanner


【解决方案1】:

来自文档:

nodesForXPath:error: 方法 返回一个 NSXMLNode 对象数组

您的数组未包含字符串。它充满了各种NSXML* 对象。他们不是垃圾。这正是它应该如何工作的。

您可能不会调用length,但stringWithString: 可能会调用length 来确定要在新字符串中分配多少空间。


转换为字符串可能意味着很多事情。一个 XML 节点可能是一个独立的标签,它可能是一些内联 CDATA,它可能是一个具有各种属性的标签。同样,XML 文档是高度结构化的。如果不应用一些结构意义,将文档的内容作为标签/内容的直接枚举来遍历几乎没有意义。

您可能需要递归或以其他方式遍历标签并适当地解释其内容。

第一步是删除除初始 NSLog() 之外的所有内容,然后看看你得到了什么。然后弄清楚如何遍历节点树。然后弄清楚如何适当地解析它们。

【讨论】:

  • 如何将其转换为字符串?
【解决方案2】:

您确定您的arr 包含NSString 对象吗? NSXMLElement 抛出错误的事实在我看来很可疑。

编辑

是的,看起来文档说来自nodesForXPath 的数组不包含NSString 对象,而是NSXMLElement 对象。

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSXMLNode_Class/Reference/Reference.html#//apple_ref/occ/instm/NSXMLNode/nodesForXPath:error:

【讨论】:

  • 它们是 NSStrings。我已经解释了为什么它在日志中调用NSXMLElement - 它输出垃圾,它发生了几次。随着循环的继续,它应该搜索的字符串似乎被清除了......
  • 我和 Paul 在一起,很可能数组中的某些项目不是 NSString 的实例。你是如何创建数组的? (代码会很有帮助)。
  • 它们是字符串。我已经编辑了帖子以展示我是如何创建数组的。
  • 根据 Apple 的文档:“nodesForXPath:error: 方法返回一个 NSXMLNode 对象数组”。
  • 我确定 [doc nodesForXpath:] 不是返回字符串而是返回 NSXMLElement
猜你喜欢
  • 2011-09-13
  • 2020-10-28
  • 2021-02-13
  • 2022-11-29
  • 1970-01-01
  • 2012-07-09
  • 2015-09-03
  • 2018-04-21
相关资源
最近更新 更多