gpt4 book ai didi

php - 如何在div父节点中追加子节点?

转载 作者:数据小太阳 更新时间:2023-10-29 02:39:50 24 4
gpt4 key购买 nike

我需要将子节点附加到它们的父节点,但父节点应该是div

我需要检查,如果父节点不是 div 那么,检查父节点的父节点,直到我得到 div 节点。怎么做?

XML 文件

    <div class="parent">
<div class="boxed-text">box text1</div>
<li>
<div class="boxed-text">box text2</div>
<p>para</p>
</li>
<div class="boxed-text">box text3</div>
<p>para</p>
</div>

预期输出(应该附加到 div 父节点)

    <div class="parent">
<li>
<p>para</p>
</li>
<p>para</p>
<div class="boxed-text">box text1</div>
<div class="boxed-text">box text2</div>
<div class="boxed-text">box text3</div>
</div>

但我得到如下输出:(即盒装文本 2 的父节点是 li 标记,因此它被附加到那里而不是 div 父节点。如何仅获取 div 父节点追加子节点?)

    <div class="parent">
<li>
<p>para</p>
<div class="boxed-text">box text2</div>
</li>
<p>para</p>
<div class="boxed-text">box text1</div>
<div class="boxed-text">box text3</div>
</div>

我的代码:

$dom = new DOMDocument;
$dom->load("new_test.xml", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DOMXPath($dom);
$xp->registerNamespace("php", "http://php.net/xpath");
$div = $xp->query("//div[@class='boxed-text']");
foreach($div as $divv) {
$divv->parentNode->appendChild($divv);
}
$r = $dom->saveXML();

最佳答案

您将节点附加到它们的父节点,但这只会将它们移动到父节点内的最后一个位置 - 它不会更改父节点。

Xpath 有轴的概念。默认轴是 child - 当前上下文的子级。但这里还有其他几个,包括 ancestor,它表示返回文档根目录的路径。

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load("new_test.xml", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xp = new DOMXPath($dom);
$xp->registerNamespace("php", "http://php.net/xpath");

$divs = $xp->evaluate("//div[@class='boxed-text']");
foreach($divs as $div) {
$ancestor = $xp->evaluate('ancestor::div[1]', $div)->item(0);
if ($ancestor) {
$ancestor->appendChild($div);
}
}

echo $dom->saveXML();

输出:

<?xml version="1.0"?>
<div class="parent">
<li>
<p>para</p>
</li>
<p>para</p>
<div class="boxed-text">box text1</div>
<div class="boxed-text">box text2</div>
<div class="boxed-text">box text3</div>
</div>

另一种方法是遍历父 div 元素并获取每个元素的盒装文本后代:

$parents = $xp->evaluate("//div[.//div[@class='boxed-text']]");
foreach ($parents as $parent) {
foreach ($xp->evaluate(".//div[@class='boxed-text']", $parent) as $text) {
$parent->appendChild($text);
}
}

关于php - 如何在div父节点中追加子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32839408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com