作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我需要将子节点附加到它们的父节点,但父节点应该是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/
我是一名优秀的程序员,十分优秀!