2014-01-19 116 views
0

如何使用DOM將表中的每個tr的內部值提取到td?我有這樣一個表:獲取每個tr的表的td值

<table> 
    <tbody> 
     <tr class="rowData"> 
     <td class="cellData"> 
      <a href="#"><span> DATA 1 </span></a> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 1 a </div></div> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 1 b </div></div> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 1 c </div></div> 
     </td> 
     </tr> 
     <tr class="rowData"> 
     <td class="cellData"> 
      <a href="#"><span> DATA 2 </span></a> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 2 a </div></div> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 2 b </div></div> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 2 c </div></div> 
     </td> 
     </tr> 
     <tr class="rowData"> 
     <td class="cellData"> 
      <a href="#"><span> DATA 3 </span></a> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 3 a </div></div> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 3 b </div></div> 
     </td> 
     <td class="cellData"> 
      <div class="div1"><div class="div2"> DATA 3 c </div></div> 
     </td> 
     </tr> 
    </tbody> 
<table> 

我會得到的是:每一行

<label> DATA n </label> 
<input value="DATA n a"> 
<input value="DATA n b"> 
<input value="DATA n c"> 

我堅持了這樣的代碼:

$html = file_get_contents($link); 
$html2 = (preg_replace('/\s+/', ' ', $html)); 
$doc = new DOMDocument(); 
$doc->loadHTML($html2); 
$xpath = new DOMXPath($doc); 
$tables = $doc->getElementsByTagName('table'); 
foreach($xpath->query('.//tbody/tr[@class="rowData"]') as $node){ 
} 
foreach($xpath->query('.//tbody/tr/td/div/div[@class="div2"]') as $node){ 
} 
foreach($xpath->query('.//tbody/tr/td/a/span') as $node){ 
echo $node->nodeValue; 
} 

有人能幫助我嗎?

回答

0

我猜想代碼是足夠自我解釋。 XPath使用三次:查找所有錶行,獲取標籤並獲取所有輸入值。

foreach($xpath->query('.//tbody/tr[@class="rowData"]') as $row) { 
    echo '<label>'.$xpath->query('td[1]/a/span', $row)->item(0)->textContent."</label>\n"; 
    foreach($xpath->query('td[position() > 1]/div/div', $row) as $col) { 
     echo '<input value="'.trim($col->textContent).'" />'."\n"; 
    } 
} 
+0

感謝您的解決方案,我不得不修復

+0

這真的很奇怪,特別是當第二個XPath查詢構建完全相同的方式適合你。 –

0

下面是一個可能的解決方案,實際上是兩個 - 但評論其中之一太難看了。 :)

$html = file_get_contents($link); 
$html2 = (preg_replace('/\s+/', ' ', $html)); 
$doc = new DOMDocument(); 
$doc->loadHTML($html2); 

$elements = $doc->getElementsByTagName('tr'); 
foreach($elements as $node){ 

$inputs1=$node->getElementsByTagName('div')->item(1); // 0,2,4...does same 
$inputs2=$node->getElementsByTagName('div')->item(3); 
$inputs3=$node->getElementsByTagName('div')->item(5); 

echo '<label>'. $node->firstChild->nodeValue. '</label>'; 
echo '<input value="'. $inputs1->nodeValue. '">'; 
echo '<input value="'. $inputs2->nodeValue. '">'; 
echo '<input value="'. $inputs3->nodeValue. '">'; 

//ugly as hell - but it is working :) 

/*echo '<input value="'. $node->firstChild->nextSibling->nextSibling->nodeValue. '">'; 


echo '<input value="'. $node->firstChild->nextSibling->nextSibling->nextSibling->nextSibling->nodeValue. '">'; 

echo '<input value="'. $node->firstChild->nextSibling->nextSibling->nextSibling->nextSibling->nextSibling->nextSibling->nodeValue. '">';*/ 

echo '<br>'; 
} 
+0

感謝這個代碼的幫助:)但我有一些問題,第三單元出現空洞,我解決了該解決方案提出延ERAT和2與它的工作原理細微的變化。但感謝您花費在解決的時間:) – user2694390

+0

Np,肯定會接受更好的解決方案。 :)但是,如何第三個單元格出現空...在相同的HTML /表結構? – sinisake