XPath子串 - 后帮助/查询/评估?

时间:2015-05-26 05:43:18

标签: php sql xml xpath

我正在构建一个php脚本,将xml文件的选定内容传输到sql数据库。

其中一个硬编码的XML内容格式如下:

<visualURL>
id=18144083|img=http://upload.wikimedia.org/wikipedia/en/8/86/Holyrollernovacaine.jpg
</visualURL>

我正在寻找一种方法来获取网址的内容(img =后的所有文字)。

$Image = $xpath->query("substring-after(/Playlist/PlaylistEntry[1]/visualURL[1]/text(), 'img=')", $element)->item(0)->nodeValue;

在我的php输出上显示属性非对象错误。

必须有另一种方法可以使用我想要的XPath提取URL内容,不是吗?

非常感谢任何帮助!

编辑:

这是最小代码

<?php

$xmlDoc = new DOMDocument();
$xmlDoc->loadXML('<Playlist>
<PlaylistEntry>
<visualURL>
id=12582194|img=http://upload.wikimedia.org/wikipedia/en/9/96/Sometime_around_midnight.jpg
</visualURL>
</PlaylistEntry>
</Playlist>');
$xpath = new DOMXpath($xmlDoc);
$elements = $xpath->query("/Playlist/PlaylistEntry[1]");

if (!is_null($elements)) 
foreach ($elements as $element) 
$Image = $xpath->query("substring-after(/Playlist/PlaylistEntry[1]/visualURL[1]/text(), 'img=')", $element)-  >item(0)->nodeValue;
print "Finished Item: $Image";

?>

编辑2:

经过一些研究后,我相信我必须使用     $ xpath-&GT;评估 而不是我目前使用的     $ xpath-&GT;查询

看到这个链接 Same XPath query is working with Google docs but not PHP

我还不确定如何做到这一点......但我会在早上进行更多调查。再次,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

你的方向正确。使用DOMXPath::evaluate()表示不返回substring-after()之类节点的xpath表达式(它返回链接页面中记录的string)。以下代码打印预期输出:

$xmlDoc = new DOMDocument();
$xml = <<<XML
<Playlist>
<PlaylistEntry>
<visualURL>
id=12582194|img=http://upload.wikimedia.org/wikipedia/en/9/96/Sometime_around_midnight.jpg
</visualURL>
</PlaylistEntry>
</Playlist>
XML;

$xmlDoc->loadXML($xml);
$xpath = new DOMXpath($xmlDoc);
$elements = $xpath->query("/Playlist/PlaylistEntry");

foreach ($elements as $element) {
    $Image = $xpath->evaluate("substring-after(visualURL, 'img=')", $element);
    print "Finished Item: $Image <br>";
}

输出

Finished Item: http://upload.wikimedia.org/wikipedia/en/9/96/Sometime_around_midnight.jpg 

<强> Demo