PHP DOMDocument如何遍历所有节点并获取name、value(如果有)、attributes(键值对)?

假设一个未知XML/HTML字符串/文件$doc对象,根节点未知。
假设一个结构体:

class NodeInfo {
    public $name = '';
    public $value = null; //如果没有儿子节点且不是空节点,否则都是null
    public $attributes = []; //key=>value
    public $children = []; //NodeInfo[]
}

如何遍历$doc然后存储到一个NodeInfo中?

我试着用$doc->childNodes获取所有子节点,然后遍历,如果hasChildNodes就继续递归这个函数(函数还没写,我直接在PHPUnit中一个一个循环试了一遍),但是发现几个问题:

1. 根节点遍历了两遍
2. 属性名、节点类型(#text)也都遍历出来了,显然我一脸懵逼,这玩意定义上是node不错但是我是打算在一个node或者element上单独获取的呀?
3. element和node啥区别?不是定义上,是指php中如何区分?