通过PHP遍历DOM

时间:2018-03-08 18:46:53

标签: php xml

我正在浏览给定的DOMPHP。我正在使用php DOMdocument类来遍历它。到目前为止我所做的是遍历所有DOM,我能够获得每个元素的nodeValue。但我想要做的是检测,如果孩子DOM元素有孩子,则在每个孩子的节点值之前添加&nbsp空格。但对于所有兄弟姐妹来说,这个空间应该是相同的:

    • 孩子
    • 孩子
      • subchild
      • subchild
        • grandsubchild
        • grandsubchild

这就是我所做的:

$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("&nbsp;", $GLOBALS['i']).$element->nodeValue."<br>";

		}

}

foreach($elements as $element){
   traverseDom($element);
}

1 个答案:

答案 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("&nbsp;", $level).$out."<br>";
        }
    }
}

foreach($elements as $element) {
    traverseDom(0, $element);
}