如何使用domdocument处理数据完整性问题?

时间:2011-09-06 18:13:10

标签: php domdocument

给出表格的一系列元素

<td class="name">Product Name</td>
<td class="price">$10.00</td>

可以使用domdocument()将包含100个名称/价格对的页面解析为100个名称组和100个价格的单独组。但是,如果缺少其中一个价格,您将得到一组100个名称,以及一组99个价格,并且不清楚哪个产品缺少其价格。

使用正则表达式解析名称/价格数据对(使价格可选)可以识别哪个产品缺少价格,因为结果是100对,其中一个具有空价格值。有没有办法使用domdocument()实现这一点,所以没有必要使用正则表达式解析html?

编辑:我尝试了dqhendricks的建议,但我在foreach循环上遇到语法错误,其中包含以下内容

<?php

$html = <<<EOT

<table>
    <tr>
       <td class="productname">a</td>
       <td class="price">1</td>
    </tr>

    <tr>
       <td class="productname">b</td>
       <td class="price">2</td>
    </tr>

    <tr>
       <td class="productname">c</td>
       <td class="price">3</td>
    </tr>

    <tr>
       <td class="productname">d</td>
       <td class="price">4</td>
    </tr>

    <tr>
       <td class="productname">e</td>
       <td class="price">5</td>
    </tr>
</table>

EOT;

libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->loadhtml($html);
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//table/tr/') as $node) {
    $name = $node->query('td[@class="productname"]');
    $price= $node->query('td[@class="price"]');
}

print_r($node);

?>

1 个答案:

答案 0 :(得分:1)

使用这种结构,你不会迭代通过td元素并检查它们的类属性吗?如果一行中有两个名称属性,你知道第一个是缺少价格吗?

你的解析代码在哪里?我想问题就在那里。你只是用xpath来获得产品清单和价格清单或者什么?

现在,如果您的html文档的结构如下:

<tr>
   <td class="productname">x</td>
   <td class="price">x</td>
</tr>

您需要遍历tr元素并检查其内容,您将很容易知道哪些产品缺少价格。

编辑:

 foreach ($xpath->query('//table/tr/') as $node) {
    $name = $node->query('td[@class="name"]');
    $price= $node->query('td[@class="price"]');
 }

反正这样......