使用Xpath在iOS中查询HTML

使用Xpath在iOS中查询HTML,ios,objective-c,xpath,Ios,Objective C,Xpath,我花了两天的时间努力查询HTML的文本和值,但到目前为止运气不好 我有一个html文档,内容如下所示 <select name="ctl00$ContentPlaceHolder1$ddlAreas" id="ctl00_ContentPlaceHolder1_ddlAreas"> <option value="01">Area1</option> <option value="02">Area2</option>

我花了两天的时间努力查询HTML
的文本和值,但到目前为止运气不好

我有一个html文档,内容如下所示

<select name="ctl00$ContentPlaceHolder1$ddlAreas" id="ctl00_ContentPlaceHolder1_ddlAreas">
    <option value="01">Area1</option>
    <option value="02">Area2</option>
    <option value="03">Area3</option>
    <option value="04">Area4</option>
</select>
选项的内部文本,如区域1、2、3、4

我正在使用xPath表达式来检索

//select[@id=\"ctl00_ContentPlaceHolder1_ddlAreas\"]/option/@value 
选项01、02、03、04的值

实际上,我希望提取内部文本和值,并用分隔符(如“#”)组合。我想要的输出

Area1#01,
Area2#02
Area3#03
Area4#04....
我尝试使用方法
concat()

但似乎只返回第一个选项-Area1,并且根本没有任何分隔符


如果有人能想出一个解决方案,我将不胜感激。

您可以使用xml/html解析器来解析您的html

#导入“TFHpple.h”
NSString*html=@“Area1Area2Area3Area4”;
NSData*data=[html数据使用编码:NSUTF8StringEncoding];
TFHpple*parser=[TFHpple-hppleWithHTMLData:data];
NSString*optionPath=@”//select[@id=\“ctl00\u ContentPlaceHolder1\u ddlAreas\”]/option”;
NSArray*optionNodes=[parser searchWithXPathQuery:optionPath];
for(选项节点中的TFHPPLELEMENT*元素){
NSDictionary*属性=[元素属性];
if([attributes objectForKey:@“value”]){
NSString*str=[NSString stringWithFormat:@“%@#%@”,element.text,[attributes objectForKey:@“value”];
NSLog(@“%@”,str);
}
}
输出为

区域1#01

区域2#02

区域3#03

区域4#04

有没有更好的解决方案可以通过XPath表达式一次检索文本和值

不,这不能用单个XPath 1.0表达式完成。使用
concat()
的解决方案的原因:

仅返回第一个结果:

Area1#01
XPath 1.0中的函数期望将单个节点作为参数,当传递给一系列节点时,只处理第一个节点,而忽略所有其他节点。此外,在XPath1.0中,函数不能真正成为路径表达式中的步骤

在XPath2.0中,您可以

//select[@id = 'ctl00_ContentPlaceHolder1_ddlAreas']/option/concat(.,'#',@value)
concat()
将依次应用于每个
选项
元素



总之,纯XPath 1.0无法做到这一点。使用XPath表达式检索所有
选项
元素节点,并使用嵌入XPath的更高级语言在XPath之外进一步处理它们,如myte所示。

感谢您的回复。是的,我已经用过了。现在我还有一个与您的非常类似的替代解决方案-迭代属性,然后组合element.text和value。我想这不是最好的解决办法。有没有更好的解决方案可以通过XPath表达式一次检索文本和值?像@”//select[@id=\“ctl00\u ContentPlaceHolder1\u ddlareaces\”]/option[concat(/text(),@value)]?
#import "TFHpple.h"

NSString * html = @"<select name=\"ctl00$ContentPlaceHolder1$ddlAreas\" id=\"ctl00_ContentPlaceHolder1_ddlAreas\"><option value=\"01\">Area1</option><option value=\"02\">Area2</option><option value=\"03\">Area3</option><option value=\"04\">Area4</option></select>";

NSData* data = [html dataUsingEncoding:NSUTF8StringEncoding];

TFHpple *parser = [TFHpple hppleWithHTMLData:data];
NSString *optionPath = @"//select[@id=\"ctl00_ContentPlaceHolder1_ddlAreas\"]/option";
NSArray *optionNodes = [parser searchWithXPathQuery:optionPath];

for (TFHppleElement *element in optionNodes) {

    NSDictionary * attributes = [element attributes];

    if ([attributes objectForKey:@"value"]){

        NSString * str = [NSString stringWithFormat:@"%@#%@",element.text, [attributes objectForKey:@"value"]];

        NSLog(@"%@", str);

    }

}
concat(//select[@id = 'ctl00_ContentPlaceHolder1_ddlAreas']/option/text(),"#",//select[@id = 'ctl00_ContentPlaceHolder1_ddlAreas']/option/@value)
Area1#01
//select[@id = 'ctl00_ContentPlaceHolder1_ddlAreas']/option/concat(.,'#',@value)