Pen*_*m10 19 javascript php xml xpath dom
这是Javascript中有效的XPath:
id("priceInfo")/div[@class="standardProdPricingGroup"]/span[1]
Run Code Online (Sandbox Code Playgroud)
这变成了有效的PHP XPath,可以与DOMXPath-> query()一起使用
//*[@id="priceInfo"]//div[@class="standardProdPricingGroup"]//span[1]
Run Code Online (Sandbox Code Playgroud)
我主要担心的是可能存在很多差异,我希望找出这些差异,并且我有问题来识别这些差异.
问题也可能以不同的方式提出:由于Javascript可以有不同的有效XPath格式,如何规范化它们以使用PHP.
其中一个更新还提到如果存在包含此定义的有效DTD,则id()函数是有效的XPath.我对输入DTD没有权力,如果有办法找到一个没有任何特定DTD的解决方案,那就太棒了.
更新:
我想用算法将第一种格式转换为第二种格式.我的输入是第一个而不是第二个.无法改变这一点.
正如@NisonMaël指出的那样,第二种格式是有效的Javascript XPath,如下所示:http://jsbin.com/elatum/2/edit这不幸只是增加了Javascript XPath"碎片化"的问题.
@salathe指出,如果记录的输入具有有效的DTD,则有效的Javascript XPath查询在PHP中可以正常工作(@Dimitre Novatchev在评论中提到了这一点,但忽略了重要性).不幸的是我无法控制输入DTD,所以现在我必须研究一种方法来克服这个问题,或者找到一种即使没有有效的DTD也可以工作的解决方案.
只是看到Salathe实际上回答了同样的事情,但考虑到你的评论并强调这一点:
您无需指定任何DTD.只要您使用DOMDocument::loadHTML或DOMDocument::loadHTMLFile函数,HTML id属性实际上是为xpath id()函数注册的.使用http://jsbin.com/elatum/2/edit中提供的演示HTML ,您甚至在加载文档时出错:
警告:DOMDocument :: loadHTMLFile():ID priceInfo已在...中定义
这已经表明这是一个真正的ID属性,因为它嘲笑重复.相关的示例代码如下所示:
$xpath = 'id("priceInfo")/div[@class="standardProdPricingGroup"]/span[1]';
$doc = new DOMDocument();
$doc->loadHTMLFile(__DIR__ . '/../data/file-11796340.html');
$xp = new DOMXPath($doc);
$r = $xp->query($xpath);
echo $xpath, "\n";
echo $r ? $r->length : 0, ' elements found', "\n";
if (!$r) return;
foreach($r as $node) {
echo " - ", $node->nodeValue, "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出是:
id("priceInfo")/div[@class="standardProdPricingGroup"]/span[1]
1 elements found
- hello
Run Code Online (Sandbox Code Playgroud)
如果您需要更多控制,首先运行xpath将所有HTML id属性标记为xpath的ID:
$r = $xp->query("//*[@id]");
if ($r) foreach($r as $node) {
$node->setIdAttribute('id', true);
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在id()函数中使用相同的xpath ,无需更改它.
| 归档时间: |
|
| 查看次数: |
793 次 |
| 最近记录: |