2011-03-12 41 views
0
<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++; 
} 

返回值我尝试了以下疑问:的XPath不带引号的

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

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

我可以返回<item><title>就好了。只是不是<link>。有什么我失踪?

+0

从你的问题的标题,你说,你可以返回的链接,如果它没有行情? – tkm256 2011-03-12 04:13:32

+0

我无法控制文档,因此我无法删除引号。 – Tek 2011-03-12 04:26:38

回答

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。

既然你已经在使用DOM与标记工作应该是

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

,你还可以用它创建的,而不是使用字符串连接,例如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

+1

+1优秀的答案。 – 2011-03-12 14:30:56