在有效的PHP查询()XPath中转换Javascript XPath 规范化JS XPath - > PHP

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)
  1. 你知道任何已经进行过这种转换的库或自定义组件吗?
  2. 你知道列出两种语法差异的可用文档吗?

我主要担心的是可能存在很多差异,我希望找出这些差异,并且我有问题来识别这些差异.

问题也可能以不同的方式提出:由于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也可以工作的解决方案.

hak*_*kre 7

只是看到Salathe实际上回答了同样的事情,但考虑到你的评论并强调这一点:

您无需指定任何DTD.只要您使用DOMDocument::loadHTMLDOMDocument::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 ,无需更改它.