PHP DOMDocument,按ID删除元素

时间:2017-05-05 11:08:55

标签: php domdocument

现在已经尝试了将近一个小时。尽管每个人都坚持使用DOMDocument处理XML / HTML是多么容易和直接,但我找不到合适的答案。

如何从这个简单的html中删除元素id = delete_me?

fopen

所以结果只是

<div class="something">
important stuff
<div id="delete_me">
not so important stuff, better delete me
</div>
</div>

我不会那么困难。每次我必须使用DOMDocument时,我都会疯了。

这是一个如此简单的问题和日常任务,但仍然无法找到可行的解决方案。

非常感谢帮助。

1 个答案:

答案 0 :(得分:2)

libxml的某些版本需要存在doctype才能使getElementById正常工作,因此这里采用相当“hacky”的方法会略微欺骗libxml。

    $doc='<!doctype>';

    $html='
        <div class="something">
            important stuff
            <div id="delete_me">
                not so important stuff, better delete me
            </div>
        </div>';

    /* append the doctype */
    $html=$doc . $html;

    $dom=new DOMDocument;
    $dom->validateOnParse = false;
    $dom->loadHTML( $html );

    /* get the element to be deleted */
    $div=$dom->getElementById('delete_me');

    /* delete the node */
    if( $div && $div->nodeType==XML_ELEMENT_NODE ){
        $div->parentNode->removeChild( $div );
    }
    echo $dom->saveHTML();
    $dom=null;

或者使用DOMXPath通过查询id并删除来查找元素。

    $html='
        <div class="something">
            important stuff
            <div id="delete_me">
                not so important stuff, better delete me
            </div>
        </div>';
    $dom=new DOMDocument;
    $dom->validateOnParse = false;
    $dom->loadHTML( $html );
    $xp=new DOMXPath( $dom );

    $col = $xp->query( '//div[ @id="delete_me" ]' );
    if( !empty( $col ) ){
        foreach( $col as $node ){
            $node->parentNode->removeChild( $node );
        }
    }
    echo $dom->saveHTML();
    $dom=null;