出于某种原因,我无法让 saveHTML/saveXML 方法工作。所以我编写了自己的递归例程,它对我有用:
function pvIndent ( $ind ) {
for ($i=0;$i<$ind;$i++)
print ( " " );
}
function pvPrint_r ( $val ) {
echo '<pre>';
print_r ( $val );
echo '</pre>';
}
function pvDOMNodeListPrint_r_ ( $ind,$DOMNodeList ) {
for ($item=0;$item<$DOMNodeList->length;$item++) {
$DOMNode = $DOMNodeList->item($item);
if ($DOMNode->nodeName != "#text") {
pvIndent ( $ind );
print $DOMNode->nodeName;
if ($DOMNode->nodeValue)
print " = " . trim($DOMNode->nodeValue);
print "\n";
if ($DOMNode->attributes)
for ($attr=0;$attr<$DOMNode->attributes->length;$attr++) {
$DOMNodeAttr = $DOMNode->attributes->item($attr);
pvIndent ( $ind+1 );
print "@" . $DOMNodeAttr->nodeName . " = " . trim($DOMNodeAttr->nodeValue) . "\n";
}
if ($DOMNode->childNodes)
pvDOMNodeListPrint_r_ ( $ind+1,$DOMNode->childNodes );
}
}
}
function pvDOMNodeListPrint_r ( $DOMNodeList ) {
echo '<pre>';
pvDOMNodeListPrint_r_ ( 0,$DOMNodeList );
echo '</pre>';
}
使用对 XDOMPath 对象的查询结果调用 pvDOMNodeListPrint_r。
备注:
pv 只是我用来避免命名空间污染的前缀——随意编辑它。
使用了 pre 标记,因此在 html 正文中输出时可以正确处理空格和换行符以进行格式化,这是我通常需要此类调试语句的地方 - 您可以根据自己的喜好进行格式化。
我已经明确跳过了名为“#text”的 DOMNode,因为它们似乎重复了父节点中已经包含的文本。我不确定这对于所有加载了 HTML 的有效 XDOMPath 是否正确,但我还没有看到异常 - 如果您不介意通常的冗余,您可以随时消除排除。