如何从DOMDocument中删除除自定义节点外的所有节点?



我在PHP中有一个DOMDocument,我试图删除所有节点,除了具有特定ID的容器。

假设我有以下DOM文档:

<section>
<div id="first-section">
<ul>
<li>Test</li>
<li>Test</li>
</ul>
</div>
<div id="second-section">
<ul>
<li>Test</li>
<li>Test</li>
</ul>
<div id="sub-section">
<h2>Hello World</h2>
</div>
</div>
<div id="third-section">
<ul>
<li>Test</li>
<li>Test</li>
</ul>
</div>
</section>

My PHP Code:

$domDocument = $this->domParser->loadHTML($markup);
$xpath = new DOMXPath($domDocument);
$nlist = $xpath->query("//*[@id='sub-section']");
$domDocument->saveHTML();
使用这段代码,我查询了正确的容器。但是,我怎样才能从我的文档中删除除这个节点之外的所有节点,从而最终得到以下节点:
<div id="sub-section">
<h2>Hello World</h2>
</div>

What I tried

我试图用这样的查询走相反的路:"/*/*[not(@id='test')]",但它对嵌套的HTML结构不起作用。有时,根据结构的不同,它会删除所有节点。

这里该怎么走?

这个逻辑很奇怪。你怎么知道该保留什么?在嵌套的情况下呢?

我会选择我需要的,并复制到一个新的文档。

将节点克隆到新文档

$xml = <<<'_XML'
<section>
<div id="first-section">
<ul>
<li>Test</li>
<li>Test</li>
</ul>
</div>
<div id="second-section">
<ul>
<li>Test</li>
<li>Test</li>
</ul>
<div id="sub-section">
<h2>Hello World</h2>
</div>
</div>
<div id="third-section">
<ul>
<li>Test</li>
<li>Test</li>
</ul>
</div>
</section>
_XML;
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML($xml);
$newDoc = new DOMDocument();
$newDoc->appendChild($newDoc->importNode($doc->getElementById('sub-section'), true));
echo $newDoc->saveHTML();

只提取一个节点

当您只需要一个节点时,您可以更轻松地使用

libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML($xml);
echo $doc->saveHTML($doc->getElementById('sub-section'));

输出两个示例的输出相同。

<div id="sub-section">
<h2>Hello World</h2>
</div>
演示

https://3v4l.org/ttTS6

最新更新