我正在浏览给定的DOM
到PHP
。我正在使用php DOMdocument
类来遍历它。到目前为止我所做的是遍历所有DOM,我能够获得每个元素的nodeValue
。但我想要做的是检测,如果孩子DOM
元素有孩子,则在每个孩子的节点值之前添加 
空格。但对于所有兄弟姐妹来说,这个空间应该是相同的:
这就是我所做的:
$html = "<body>
I am the Boss
<div>
I am Nadeem
<div>
I am Rayyan and child of Nadeem
<ul>
<li>I am child of Rayyan</li>
<li>I am child of Rayyan</li>
<li>I am child of Rayyan</li>
<li>I am child of Rayyan</li>
<li>I am child of Rayyan</li>
<li>I am child of Rayyan</li>
<li>I am child of Rayyan</li>
</ul>
<div>
I am child of Rayyan and sibling of his children
</div>
</div>
<div>
I am Mehroyan and Child of Nadeem
</div>
</div>
<div>
I am Faisal, Sibling of Nadeem
<h2>
I am Adnan and child of Faisal
<a >I am child of Adnan</a>
</h2>
</div>
<div>
I am Saud
<span>
I am Zohaib son of Saud
<ul>
<li>I am son of Zohaib</li>
<li>I am son of Zohaib</li>
<li>I am son of Zohaib</li>
</ul>
<ul>
<li>I am son of Zohaib and Sibling as well</li>
<li>I am son of Zohaib and Sibling as well</li>
<li>I am son of Zohaib and Sibling as well</li>
</ul>
</span>
<span>
I am Zaryab son of Saud and sibling of Zohaib
<div>
I am Zaryab Son
<h4>
I am Zaryab Grandson
<a > I am Zaryab Grand Grand Son</a>
</h4>
</div>
</span>
</div>
</body>";
$document = new DOMdocument();
libxml_use_internal_errors(true);
$document->loadHTML($html);
$elements = $document->getElementsByTagName("body");
$GLOBALS['i'] = 1;
function traverseDom($element){
if($element->hasChildNodes()){
foreach($element->childNodes as $child){
$GLOBALS['i']++;
traverseDom($child);
}
}
else{
echo str_repeat(" ", $GLOBALS['i']).$element->nodeValue."<br>";
}
}
foreach($elements as $element){
traverseDom($element);
}
答案 0 :(得分:1)
我认为问题在于你使用GLOBAL值来跟踪要使用的空格,这只会增加。另一种方法是将“级别”传递给每个级别,这决定了空间的输出数量。我还使用trim()
删除了内容的任何填充。
$document = new DOMdocument();
libxml_use_internal_errors(true);
$document->loadHTML($html);
$elements = $document-> getElementsByTagName("body");
function traverseDom($level, $element) {
if ($element->hasChildNodes()) {
foreach($element->childNodes as $child) {
traverseDom($level+1, $child);
}
} else {
$out = trim($element->nodeValue);
if ( !empty($out) ) {
echo str_repeat(" ", $level).$out."<br>";
}
}
}
foreach($elements as $element) {
traverseDom(0, $element);
}