php:我如何使用html作为xml?如何找到特定节点并获取这些节点内的文本?

时间:2010-07-01 10:33:29

标签: php xml html-parsing

假设我有以下网页:

<html>
<body>
 <div class="transform">
    <span>1</span>
 </div>
 <div class="transform">
    <span>2</span>
 </div>
 <div class="transform">
    <span>3</span>
 </div>
</body>
</html>

我想找到包含类转换的所有div元素并获取每个div元素中的文本?

我知道我可以使用正则表达式轻松地做到这一点,但我想知道如何在没有正则表达式的情况下做到这一点,但是解析xml并找到我需要的所需节点。

更新

我知道在这个例子中我可以遍历所有的div。但这只是为了说明我需要的一个例子。

在此示例中,我需要查询包含属性class=transform

的div

谢谢!

3 个答案:

答案 0 :(得分:1)

可以使用SimpleXML - 请参阅以下示例:

$string = "<?xml version='1.0'?> 
<html>
<body>
 <div class='transform'>
    <span>1</span>
 </div>
 <div>
    <span>2</span>
 </div>
 <div class='transform'>
    <span>3</span>
 </div>
</body>
</html>";

$xml = simplexml_load_string($string);
$result = $xml->xpath("//div[@class = 'transform']");

foreach($result as $node) {
  echo "span " . $node->span . "<br />";
}

使用xpath ...

更新了它

答案 1 :(得分:1)

您可以使用xpath来处理项目。对于该特定查询,您将使用:

div[contains(concat(" ",@class," "), concat(" ","transform"," "))]

完整的PHP示例:

<?php
  $document = new DomDocument();
  $document->loadHtml($html);
  $xpath = new DomXPath($document);
  foreach ($xpath->query('div[contains(concat(" ",@class," "), concat(" ","transform"," "))]') as $div) {
    var_dump($div);
  }

如果你知道CSS,这里有一个方便的XP选择器到XPath表达式映射:http://plasmasturm.org/log/444/ - 你可以找到那里列出的上面的例子,以及其他常见的查询。

如果你经常使用它,你可能会发现我的csslib库很方便。它提供了一个包装器csslib_DomCssQuery,类似于DomXPath,但使用的是CSS选择器。

答案 2 :(得分:0)

好吧我想要的东西可以使用php xpath轻松实现:

示例:

http://ditio.net/2008/12/01/php-xpath-tutorial-advanced-xml-part-1/