Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用domdocument处理数据完整性问题?_Php_Domdocument - Fatal编程技术网

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

Php 如何使用domdocument处理数据完整性问题?,php,domdocument,Php,Domdocument,给定一系列元素的形式 <td class="name">Product Name</td> <td class="price">$10.00</td> 产品名称 $10.00 可以使用domdocument()将包含(例如)100个名称/价格对的页面解析为一组100个名称和一组单独的100个价格。然而,如果其中一个价格缺失,你会得到一组100个名称,一组99个价格,并且不清楚哪个产品缺失了它的价格 使用正则表达式解析成对的名称/价格数据(使价格

给定一系列元素的形式

<td class="name">Product Name</td>
<td class="price">$10.00</td>
产品名称
$10.00
可以使用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);

?>

使用这种结构,您不是要遍历td元素并检查它们的类属性吗?如果一行中有两个名称属性,那么您知道第一个名称属性缺少价格吗

你的解析代码在哪里?我想问题就在那里。您只是在使用xpath获取产品列表和价格列表还是什么

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

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

无论如何,类似这样的东西…

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

你的解析代码在哪里?我想问题就在那里。您只是在使用xpath获取产品列表和价格列表还是什么

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

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

总之是这样的…

我正在用
$product\u names\u nodeList=$xpath->query('//table/tr/td[@class=“name”]”)进行解析
$prices\u nodeList=$xpath->query('//table/tr/td[@class=“price”]')所以我最终得到了两个节点列表。然后,我将它们组合成一个名称/价格对数组,但如果名称/价格的总数不匹配,这就不起作用。(即使是这样,也可能意味着一种产品缺少一个名称,而另一种产品缺少一个价格)。如果有某种方法可以同时解析这两种类型的数据(就像我可以使用regex一样),那绝对是我想要的。我尝试实现了这一点,但得到了
警告:为foreach()提供的参数无效。
用于foreach行。我想知道是什么使它无效。我将用于测试的代码添加到问题中。@jela$xpath->query('//table/tr/')是否返回数组或其他可迭代对象?如果没有,它会返回什么?您过去是如何循环使用query()结果的?@jela可能$xpath->query('//table/tr//')应该是$xpath->query('//table/tr'),我正在用
$product\u names\u nodeList=$xpath->query('//table/tr/td[@class=“name”])进行解析
$prices\u nodeList=$xpath->query('//table/tr/td[@class=“price”]')所以我最终得到了两个节点列表。然后,我将它们组合成一个名称/价格对数组,但如果名称/价格的总数不匹配,这就不起作用。(即使是这样,也可能意味着一种产品缺少一个名称,而另一种产品缺少一个价格)。如果有某种方法可以同时解析这两种类型的数据(就像我可以使用regex一样),那绝对是我想要的。我尝试实现了这一点,但得到了
警告:为foreach()提供的参数无效。
用于foreach行。我想知道是什么使它无效。我将用于测试的代码添加到问题中。@jela$xpath->query('//table/tr/')是否返回数组或其他可迭代对象?如果没有,它会返回什么?您过去是如何循环使用query()结果的?@jela可能$xpath->query('//table/tr//')应该是$xpath->query('//table/tr'))