【发布时间】:2017-07-22 23:42:36
【问题描述】:
我想我会编写一个简单的函数来访问 DOM 树中的所有节点。我写了它,给了它一个不太复杂的 XML 来处理它,但是当我运行它时,我只得到了顶级 (DOMDocument) 节点。
请注意,我使用的是 PHP 的生成器语法: http://php.net/manual/en/language.generators.syntax.php
这是我的功能:
function DOMIterate($node)
{
yield $node;
if ($node->hasChildNodes())
{
foreach ($node->childNodes as $subnode) {
// if($subnode != null) {
DOMIterate($subnode);
// }
}
}
}
以及应该打印结果的测试用例代码:
$doc = new DOMDocument();
$doc->loadXML($input);
foreach (DOMIterate($doc) as $node) {
$type = $node->nodeType;
if ($type == XML_ELEMENT_NODE) {
$tag = $node-> tagName;
echo "$tag\n";
}
else if ($type == XML_DOCUMENT_NODE) {
echo "document\n";
}
else if ($type == XML_TEXT_NODE) {
$text = $node->wholeText;
echo "text: $text\n";
} else {
$linenum = $node->getLineNo();
echo "unknown node type: $type at input line $linenum\n";
}
}
输入的 XML 是前 18 行 https://www.w3schools.com/xml/plant_catalog.xml 加上一个结束
【问题讨论】:
-
嗯...只是想到了一些东西。是否禁止“生成器”函数递归调用自身?如果是这样,是否有人有将遍历递归结构的“生成器”的示例?
标签: php xml recursion generator