Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS和Xpath搜索中不断重复枚举_Ios_Xpath_Hpple - Fatal编程技术网

在iOS和Xpath搜索中不断重复枚举

在iOS和Xpath搜索中不断重复枚举,ios,xpath,hpple,Ios,Xpath,Hpple,因此,我使用HPPLE在iOS应用程序中执行一些Xpath查询,需要对一些站点执行一些基本的web抓取。现在一切都很好,但我想看看是否有另一种更优雅的方式来做我正在做的事情。目前我正在做的是,我使用XPath在一个网站中查找一个特定的div类,在该网站中(基本上类似于一篇文章),可以有任意数量的子级包含文本,其他子级包含另一组子级中的文本。现在我基本上使用重复For循环来检查“text”标记名是否存在,如果存在,则将该值添加到字符串中,如果不存在,则检查是否有其他级别的子级需要扫描,到目前为止,

因此,我使用HPPLE在iOS应用程序中执行一些Xpath查询,需要对一些站点执行一些基本的web抓取。现在一切都很好,但我想看看是否有另一种更优雅的方式来做我正在做的事情。目前我正在做的是,我使用XPath在一个网站中查找一个特定的div类,在该网站中(基本上类似于一篇文章),可以有任意数量的子级包含文本,其他子级包含另一组子级中的文本。现在我基本上使用重复For循环来检查“text”标记名是否存在,如果存在,则将该值添加到字符串中,如果不存在,则检查是否有其他级别的子级需要扫描,到目前为止,我有4个级别的相同搜索。我想知道,如果当前级别中的子级计数大于0,是否有某种方法可以运行,以重新执行相同的搜索。下面是我现在如何做的代码

 for (TFHppleElement *element in searchNodes) {
    //If a Text Node is found add it to the String, if not search again with next layer
    if ([element.tagName isEqualToString:@"text"]) {
        [bigString appendString:element.content];
    }
    //1. First layer Scan
    if (element.children.count > 0) {
        for (TFHppleElement *nextStep in element.children) { 
            if ([nextStep.tagName isEqualToString:@"text"]) {
                [bigString appendString:nextStep.content];
            }
            
            //2. Second layer Scan
            if (nextStep.children.count > 0) {
                for (TFHppleElement *child in nextStep.children) { 
                    if ([child.tagName isEqualToString:@"text"]) {
                        [bigString appendString:child.content];
                        
                    }
                    
                    //3. Thrid Layer Scan
                    if (child.children.count > 0) {
                        for (TFHppleElement *children in child.children) { 
                            if ([children.tagName isEqualToString:@"text"]){
                                [bigString appendString:children.content];
                            }
                            
                            //4. Fourth Layer Scan
                            if (children.children.count > 0) {
                                for (TFHppleElement *newchild in children.children){
                                    if ([newchild.tagName isEqualToString:@"text"]) {
                                        [bigString appendString:newchild.content];
                                        
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
我希望有某种方法构建,我基本上可以通过初始NSArray发送,然后它检查其他元素,然后使用下一个数组再次执行搜索,同时继续构建NSMutableString,最终得到每次搜索的所有文本。如果没有,我现在所做的似乎很好,我只是想看看是否有更干净的方法来做这件事。

我想你想要的是。您可以编写一个递归方法,将一个元素传递给它,让它在自身之外修改一些NSMutableString(可能是一个实例变量?),然后使用自己的
子项调用自身(如果可以的话)。例如(未编译、未测试):


谢谢,蒂姆,我来试试。实际上,我也在尝试类似的方法,但在使用mutablestring时遇到了问题,因为它开始获取空值并崩溃。如果这行得通的话,我会把它标记为已回答。嘿,蒂姆,这几乎是按原样进行的。我最初的问题是,我在方法中初始化NSMutableString,这给了我一些问题,将字符串移到方法之外似乎已经清除了我造成的混乱。谢谢。是的,你必须将初始化分开,否则每次递归时都会覆盖字符串。我看到很多人遵循的一种模式是,有一个方法负责初始化(比如字符串),第一个递归调用第二个方法,可能称为
checkElementRecursive:
,它会重复调用自己。这样,您就可以公开一个一致的API(只有
checkElement:
方法),将初始化保持在一个位置,并且仍然可以享受递归的好处。
@property (nonatomic, retain) NSMutableString * bigString;
// snip
@synthesize bigString;
// snip - assume bigString gets initialized somewhere

- (void)checkElement:(TFHppleElement *)elem {
    if ([element.tagName isEqualToString:@"text"]) {
        [bigString appendString:elem.content];
    }

    if (element.children.count > 0) {
        for (TFHppleElement * child in element.children) {
            [self checkElement:child];
        }
    }
}