【问题标题】:how to handle data integrity problems with domdocument?如何处理 domdocument 的数据完整性问题?
【发布时间】:2011-09-06 18:13:09
【问题描述】:

给定表单的一系列元素

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

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

使用正则表达式解析成对的名称/价格数据(使价格可选)可以识别哪个产品缺少价格,因为结果是 100 对,其中一个具有空的价格值。有没有办法使用domdocument()来实现,这样就不需要使用regex来解析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);

?>

【问题讨论】:

    标签: php domdocument


    【解决方案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"]');
     }
    

    反正就是这样……

    【讨论】:

    • 我正在解析 $product_names_nodeList = $xpath-&gt;query('//table/tr/td[@class="name"]');$prices_nodeList = $xpath-&gt;query('//table/tr/td[@class="price"]'); 所以我最终得到了两个节点列表。然后我将它们组合成一组名称/价格对,但如果名称/价格的总数不匹配,这将不起作用。 (即使是这样,这也可能意味着一种产品缺少一个名称,而另一种产品缺少价格)。如果有某种方法可以同时解析这两种类型的数据(就像我可以使用正则表达式一样),那绝对是我想要的。
    • 我尝试实现这一点,但我为您的 foreach 行获得了 Warning: Invalid argument supplied for foreach()。我想知道是什么使它无效。我将用于测试的代码添加到问题中。
    • @jela $xpath->query('//table/tr/') 返回一个数组或其他可迭代对象吗?如果没有,它会返回什么?您过去是如何循环浏览 query() 结果的?
    • @jela 可能 $xpath->query('//table/tr/') 应该是 $xpath->query('//table/tr')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多