<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>
。有什么我想念的吗?
答案 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