带有条件的Perl XPath语句 – 可能吗?
这个问题已被重新定义.我使用CPAN Perl模块
WWW::Mechanize来浏览网站,使用
HTML::TreeBuilder-XPath来捕获内容,使用
xacobeo来测试我的HTML / XML上的XPath代码.目标是从基于PHP的网站调用此Perl脚本,并将已删除的内容上载到数据库中.因此,如果内容“缺失”,仍然需要考虑.
下面是一个经过测试的简化示例代码,描述了我的挑战.注意: >此页面是动态填充的,包含为不同商店输出的各种ITEMS;每个商店将存在不同数量的产品*.这些产品清单可能有也可能没有下面的逐项表. 下面,示例xml每个商店更改(如上所述),但为了简洁起见,我只显示一个“类型”的输出.我意识到所有数据都可以捕获到一个数组中,然后使用正则表达式来解密内容,以便将其上传到数据库中.我正在寻求更好的XPath知识,以帮助简化此(和未来)解决方案. <!DOCTYPE XHTML> <table id="8jd9c_ITEMS"> <tr><th style="color:red">The Products we have in stock!</th></tr> <tr><td><span id="Product_NUTS">We have nuts!</span></td></tr> <tr><td> <!--Table may or may not exist --> <table> <tr><td style="color:blue;text-indent:10px">Almonds</td></tr> <tr><td style="color:blue;text-indent:10px">Cashews</td></tr> <tr></tr> </table> </td></tr> <tr><td><span id="Product_VEGGIES">We have veggies!</span></td></tr> <tr><td> <!--Table may or may not exist --> <table> <tr><td style="color:blue;text-indent:10px">Carrots</td></tr> <tr><td style="color:blue;text-indent:10px">Celery</td></tr> <tr></tr> </table> </td></tr> <tr><td><span id="Product_ALCOHOL">We have booze!</span></td></tr> <!--In this case,the table does not exist --> </table> XPath语句: '//table[contains(@id,"ITEMS")]/tr[position() >1]/td/span/text()' 会发现: We have nuts! we have veggies! We have booze! 和XPath声明: '//table[contains(@id,"ITEMS")]/tr[position() >1]/td/table/tr/td/text()' 会发现: Almonds Cashews Carrots Celery 可以组合两个XPath语句: '//table[contains(@id,"ITEMS")]/tr[position() >1]/td/span/text() | //table[contains(@id,"ITEMS")]/tr[position() >1]/table/tr/td/text()' 找到: We have nuts! Almonds Cashews We have veggies! Carrots Celery We have booze! 同样,上面的数组可以使用正则表达式对其产品到列表关联进行解密(在实际代码中).但是,可以使用XPath以保持该关联的方式构建阵列吗? 例如(伪说话,这不起作用): '//table[contains(@id,"ITEMS")]/tr[position()>1]/td/span/text() | if exists('//table[contains(@id,"ITEMS")]/tr[position() >1]/table)) then ("NoTable") else ("TableRef") | Save this result into @TableRef ('//table[contains(@id,"ITEMS")]/tr[position() >1]/table/tr/td/text()')' 在Perl中构建多维数组(在传统意义上)是不可能的,参见perldoc perlref但是希望类似于上面的解决方案可以创建类似的东西: @ITEMS[0] => We have nuts! @ITEMS[1] => nutsREF <-- say,the last word of the span value + REF @ITEMS[2] => We have veggies! @ITEMS[3] => veggiesREF <-- say,the last word of the span value + REF @ITEMS[4] => We have booze! @ITEMS[5] => NoTable <-- value accounts for the missing info @nutsREF[0] => Almonds @nutsREF[1] => Cashews @veggiesREF[0] => Carrots @veggiesREF[1] => Celery 在实际代码中,产品是已知的,因此我的@veggiesREF和我的@nutsREF可以在预期XPath输出时定义. 我意识到XPath if / else / then功能是在XPath 2.0版本中.我在ubuntu系统上并在本地工作,但我仍然不清楚我的apache2服务器是使用它还是1.0版本.我该如何检查? 最后,如果您可以展示如何从PHP表单提交调用Perl脚本以及如何将Perl数组传递回调用PHP函数,那么这将获得赏金. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |