【问题标题】:Call to undefined method DOMNodeList::getElementsByTagName()调用未定义的方法 DOMNodeList::getElementsByTagName()
【发布时间】:2017-11-17 09:03:13
【问题描述】:

我想使用 PHP 的 DOMDocument 解析一个 html 表,所以我对每个表都使用了一个 foreach:foreach($_POST['comparison'] as $value) { } 我在其中嵌套了下面的代码。因此,我想从比较表中获取每一行($ 值),该值包含一个 html 表(<table> ...</table>)。这是我要解析的表:

<table>
    <tbody>
        <tr>
            <td >.....</td>
            <td>....</td>
        </tr>
        <tr>
            <td>....</td>
            <td>.....</td>
        </tr>
    </tbody>
</table>

第二个代码是这样的,我为行创建一个 foreach,然后为每一行创建一个索引 ($i),在每一行内部创建另一个 foreach,为列创建一个新索引 ($j),所以目的是像这样回显每一行的每一列(第一列第一行,第二列第一行,第一列第二行,第二列第二行......

          foreach($_POST['comparison'] as $value) {


    echo  "<div id='primary' class='content-area'>";

               var_dump($value);  // check the type in the variable value 
      $dom = new DOMDocument;

    $dom->loadHTML($value);
    $dom->preserveWhiteSpace = false;

    $tables = $dom->getElementsByTagName('table');


     foreach ($tables->getElementsByTagName('tr') as $element1) {
            for ($i = 0; $i < $element1->length; $i++) {

             echo   $element1->item($i)->nodeValue . "\n";

               foreach ($element1->getElementsByTagName('td') as $element2) {

                  for ($j = 0; $j < $element2->length; $j++) {

               echo $element2->item($j)->nodeValue . "\n";  }

           /* $value_spec[] = $element2->nodeValue + "<br>";  */
        }
     }
  }

    echo " </div><!-- content-area -->";              

 }

}

我按照错误“调用未定义方法 DOMNodeList::getElementsByTagName()”的说明进行操作,即添加 item() 以访问表格的每个单元格,但错误仍然存​​在。如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

    标签: php parsing


    【解决方案1】:

    试试这个,

    <?php
    
    $dom = new domDocument;
    $dom->loadHTML($value);
    $dom->preserveWhiteSpace = false;
    
    $tables = $dom->getElementsByTagName('table');
    $tr = $dom->getElementsByTagName('tr'); 
    
    foreach ($tr as $element1) {        
        for ($i = 0; $i < count($element1); $i++) {
            echo $element1->nodeValue . "\n";
            foreach ($element1->getElementsByTagName('td') as $element2) {
                for ($j = 0; $j < count($element2); $j++) {
                    echo $element2->nodeValue . "\n";  
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的评论,错误消失了,但现在它只打印了几行:string(5) "Array" 根据我检查了多少个复选框..
    • 出现新错误“数组到字符串的转换”,感谢帮助
    【解决方案2】:
        $tables = $dom->getElementsByTagName ('table');
    
    // At this point, if you are sure that you want the first table found,  add
    $table = $tables->item(0);
    // Below working code, I don't undersatand what you do with that loops
         foreach ($table->getElementsByTagName ('tr') as $tr) {
              foreach ($tr->getElementsByTagName ('td') as $td) {
                     echo $td->nodeValue . "\n";  
             }
         }
    

    demo

    【讨论】:

    • @SokratisV 在杠杆tr 上没什么可回应的。仅将其保存在级别 td
    • 很高兴为您提供帮助。祝你好运!
    猜你喜欢
    • 2016-01-21
    • 2018-01-28
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2012-07-27
    • 1970-01-01
    • 2019-10-25
    相关资源
    最近更新 更多