2011-09-06 45 views
1

給出了一系列形式如何使用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

這種結構,你會不會被通過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"]'); 
} 

類似的東西反正...

+0

我用'$ product_names_nodeList = $ xpath->查詢解析('//表/ TR/TD [@類= 「name」]');'和'$ prices_nodeList = $ xpath-> query('// table/tr/td [@ class =「price」]');'所以我最終得到了兩個nodeLists。然後,我將它們組合成一個名稱/價格對的數組,但如果名稱/價格的總數不匹配,則這不起作用。 (即使這樣做,這可能意味着某個產品缺少一個名稱,而另一個產品缺少價格)。如果有一種方法可以將兩種類型的數據解析在一起(就像使用正則表達式一樣),那絕對是我想要的。 – jela

+0

@jela是啊有。見上面編輯。 – dqhendricks

+0

謝謝,正是我想要的 – jela