代码之家  ›  专栏  ›  技术社区  ›  Jé Queue

PHP HTML DomDocument getElementById问题

  •  7
  • Jé Queue  · 技术社区  · 14 年前

    <?php
    header("Content-Type: text/plain");
    
    $html = '<html><body>Hello <b id="bid">World</b>.</body></html>';
    
    $dom = new DOMDocument;
    $dom->preserveWhiteSpace = false;
    $dom->validateOnParse = true;
    
    /*** load the html into the object ***/
    $dom->loadHTML($html);
    var_dump($dom);    
        
    $belement = $dom->getElementById("bid");
    var_dump($belement);
    
    ?>
    

    虽然我没有收到错误,但我只收到以下输出:

    object(DOMDocument)#1 (0) {
    }
    NULL
    

    我是不是不能查一下 <b>

    2 回复  |  直到 3 年前
        1
  •  19
  •   Wrikken    14 年前

    The Manual

    要使此函数正常工作,您需要使用DOMElement设置一些ID属性->setIdAttribute()或DTD,它定义了一个ID类型的属性。在后一种情况下,您需要使用DOMDocument验证文档->validate()或DOMDocument->在使用此函数之前验证解析。

    无论如何,选择有效的HTML&格式;提供DTD。

    快速修复:

    1. 呼叫 $dom->validate(); $dom->getElementById() ,不管是什么原因导致的错误。
    2. 如果不想验证,请使用XPath: $x = new DOMXPath($dom); $el = $x->query("//*[@id='bid']")->item(0);
    3. 想想看:如果你只是 validateOnParse 为真 之前 加载HTML,如果也可以的话;第

    $dom = new DOMDocument();
    $html ='<html>
    <body>Hello <b id="bid">World</b>.</body>
    </html>';
    $dom->validateOnParse = true; //<!-- this first
    $dom->loadHTML($html);        //'cause 'load' == 'parse
    
    $dom->preserveWhiteSpace = false;
    
    $belement = $dom->getElementById("bid");
    echo $belement->nodeValue;
    

    这里是“世界”。

        2
  •  3
  •   Syscall - leaving SO... Juhzuri    3 年前

    你应该检查一下 $dom->loadHTML($html); 返回true(成功),我会尝试

     var_dump($belement->nodeValue);
    

    以获得可能出错的线索。

    http://www.php-editors.com/php_manual/function.domdocument-get-element-by-id.html -DOMDocument似乎在内部使用XPath。

    例子:

    $xpath = xpath_new_context($dom);
    var_dump(xpath_eval_expression($xpath, "//*[@ID = 'YOURIDGOESHERE']"));