【问题标题】:PHP DOMDocument - save children of a node to string - excluding the parent nodePHP DOMDocument - 将节点的子节点保存为字符串 - 不包括父节点
【发布时间】:2015-03-17 14:49:46
【问题描述】:

我正在将 HTML 片段加载到 DOMDocument 中,对其进行修改,然后转换回字符串。

我能得到的最接近的是这个......

$html_string = "<b>my html fragment</b><div>more child nodes</div>";
$doc_html = new DOMDocument();
$doc_html->loadHTML( $html_string );
//do stuff
$html_string = $doc_html->saveHTML( $doc_html->getElementsByTagName('body')->item(0) );

这里的问题是 loadHTML 将它包装在 &lt;html&gt;&lt;body&gt; 标记中。所以我使用 getElementsByTagName 仅对 body 节点进行字符串化,但它包括它自己的 body 节点......

<body><b>my html fragment</b><div>more child nodes</div></body>

但我只想要像输入字符串一样的子节点。

除了循环所有子节点并连接一个字符串/在结果字符串上运行一个 req ex 之外,还有一种简单的方法可以做到这一点吗?

【问题讨论】:

  • 改用saveXML? saveHTML 尝试保存一个 html DOCUMENT,这意味着它将添加缺少的 body/html 标签。
  • 是的,它仍然会序列化包含节点。目前我正在使用这个.. php.net/manual/en/class.domelement.php#101243

标签: php domdocument


【解决方案1】:
<?php
$doc = doc();
$xp = new DOMXpath($doc);
$nl = $xp->query('//a');
foreach($nl as $n) {
    $df = $doc->createDocumentFragment();
    $nodes = array();
    foreach( $n->childNodes as $cn ) {
        $nodes[] = $cn;
    }
    foreach($nodes as $cn) {
        $df->appendChild(   $cn );
    }
    echo $doc->savexml( $df );
}


function doc() {
    $doc = new DOMDocument;
    $doc->loadxml(<<< eox
<doc>
    <a>
        <b>1</b>
        <b>2</b>
        <b>3</b>
        <b>4</b>
    </a>
</doc>
eox
    );
    return $doc;
}

打印

    <b>1</b>
    <b>2</b>
    <b>3</b>
    <b>4</b>

http://docs.php.net/domdocumentfragment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多