XPath不返回带引号的值

时间:2011-03-12 04:04:28

标签: php xpath

<html>

<body>

<channel>


<item>

<link>"http://www.example.com/"
</link>

<title>This is a title
</title>

</item>

<item>

<link>"http://www.example2.com/"
</link>

<title>This a 2nd title
</title>

</item>

</channel>

</body>

</html>

$query = '/html/body/channel/item/title';

$xpath->query($query);

$i = 0;

foreach ( $xpath->query($query) as $key )
{   
    echo '<p>'.$xpath->query($query) -> item($i) -> nodeValue . '</p><br />';

    $i++;
}

我尝试了以下查询:

$query = '/html/body/channel/item/link';

$query = '/html/body/channel/item/link/text()';

我可以退回<item><title>就好了。不是<link>。有什么我想念的吗?

1 个答案:

答案 0 :(得分:0)

您的代码已损坏且没有意义

1 $query = '/html/body/channel/item/title';
2 $xpath->query($query);
3 $i = 0;
4 foreach ($xpath->query($query) as $key)
5 {   
6     echo '<p>'.$xpath->query($query) -> item($i) -> nodeValue . '</p><br />';
7     $i++;
8 }

将查询标题元素(2),但由于未分配结果,因此它是多余的。然后你再做foreach并再次查询(4)。这次你将每个标题DOMElement分配给$ key(这是错误的措辞imo)。在foreach中,您对标题元素(6)进行了另一个查询,并从计数器变量(3/6)中获取其中的项目/标题元素。这也是多余的,因为你已经在$ key(3)中有了这个元素。所以你正在做三个相同的查询,你只需要一个,而不用它就可以做一个foreach。

应该是

foreach ($xpath->query('/html/body/channel/item/title') as $titleElement) {
    printf('<p>%s</p>', $titleElement->nodeValue);
}

由于您已经在使用DOM来处理标记,因此您也可以使用它来创建p元素,而不是使用字符串连接,例如。

foreach ($xpath->query('/html/body/channel/item/title') as $titleElement) {
    echo $domDocument->saveXml(
        $domDocument->createElement('p', $titleElement->nodeValue)
    );
}

如果您需要链接元素,请相应地更改XPath以查询而不是标题。节点值中的引号完全与它无关。他们会表现得很好。

Full working example showing how to combine <title> and <link> elements into <a> elements