PHP DOMXPath - 无法定位正确的节点

时间:2016-01-18 12:39:43

标签: php domxpath

我知道这可能在其他主题中有所涉及,但我一直在搜索StackOverflow并尝试了很多解决方案,这就是我要问的原因。

使用这个html:

<div class="someclass">
<table>
    <tbody>
        <tr>
            <th class="state">Status</th>
            <th class="name">Name</th>
            <th class="type">Type</th>
            <th class="length">Length</th>
            <th class="height">Height</th>
        </tr>
        <tr>
            <td class="state state2"></td>
            <td class="name"></td>
            <td class="type t18"></td>
            <td class="length">2000 m</td>
            <td class="height"></td>
        </tr>
        <tr>
            <td class="state state1"></td>
            <td class="name"></td>
            <td class="type t18"></td>
            <td class="length">2250 m</td>
            <td class="height"></td>
        </tr>
        <tr>
            <td class="state state1"></td>
            <td class="name"></td>
            <td class="type t18"></td>
            <td class="length">3000 m</td>
            <td class="height"></td>
        </tr>
        <tr>
            <td class="state state2"></td>
            <td class="name"></td>
            <td class="type t18"></td>
            <td class="length">2250 m</td>
            <td class="height"></td>
        </tr>
    </tbody>
</table>
</div>

现在,这是我到目前为止的PHP代码:

$dom = new DOMDocument();
$dom->loadHtmlFile('http://www.whatever.com');
$dom->preserveWhiteSpace = false;

$xp = new DOMXPath($dom);
$col = $xp->query('//td[contains(@class, "state1") and (contains(@class, "state"))]');
$length = 0;

foreach( $col as $n ) {
    $parent = $n->parentNode;
    $length += $parent->childNodes->item(3)->nodeValue; 
}
echo 'Length: ' . $length;

我需要:

1.- 总结&#39;长度&#39;价值所以我可以回应他们,摆脱&#39;米&#39;给定值的子字符串

2.-了解为什么我出错了'parentNodes&#39;,#39; childNodes&#39;和&#39; item()&#39;份即可。经过多次尝试,我得到了长度:0&#39;

我知道这不是获得详细解释的地方,但很难找到针对这些具体问题的教程。如果有人能就我可以获得这些信息的地方提出一些建议,那就太好了。

非常感谢。

已编辑&#39; Concat&#39;部分是为了简单。

1 个答案:

答案 0 :(得分:0)

使用DOMXpath

通过DOMDocument导航指定的childNode值
function getInt($string)
{
    preg_match("/[0-9]+/i", $string, $val);

    $out = 0;
    if (isset($val) && !empty($val))
    {
        $out = $val[0];
    }

    return intval($out);
}

$dom = new DOMDocument();
$dom->loadHtml($html);
$dom->preserveWhiteSpace = false;

$xp = new DOMXPath($dom);
$length = 0;

foreach($xp->query('//td[@class="state state1"]/following-sibling::*[3]') as $element)
{
    $value = $element->nodeValue;
    $length += getInt($value);
}


echo $length;