如何用两个手动调用替换简单的两圈循环(棘手)



这是代码:https://play.golang.org/p/Sizbc3uJt_c

我尝试替换这个简单的循环

for c := n.FirstChild; c != nil; c = c.NextSibling {
indent(space+"   ", c)
}

产生

html
head
body
a
1
a
1
div
a
2
a
3

当我尝试这个

if n.FirstChild != nil {
indent(space+"   ", n.FirstChild)
}
if n.FirstChild != nil && n.FirstChild.NextSibling != nil {
indent(space+"   ", n.FirstChild.NextSibling)
}

输出只有一半

html
head
body
a
1
a
1

当我尝试这个

if n.FirstChild != nil {
indent(space+"   ", n.FirstChild)
}
if n.NextSibling != nil {
indent(space+"   ", n.NextSibling)
}

输出是完整的,但缩进是不同的。结果是

html
head
body
a
1
a
1
div
a
2
a
3

如果你想使用你建议的第二组代码,它有一个奇怪的缩进,这是解决方案:

package main
import (
"fmt"
"log"
"strings"
"golang.org/x/net/html"
)
func main() {
r := strings.NewReader(`<a href="test1.html">1</a><a href="test1.html">1</a><div><a href="test2.html">2</a><a href="test3.html">3</a></div>`)
doc, err := html.Parse(r)
if err != nil {
log.Fatalln(err)
}
indent("", doc)
}
func indent(space string, n *html.Node) {
fmt.Println(space, n.Data)
if n.FirstChild != nil {
indent(space+"   ", n.FirstChild)
}
if n.NextSibling != nil {
indent(space, n.NextSibling)
}
}

您只需删除与n.NextSibling缩进调用的额外+" ",这样同级节点就不会比其以前的同级节点推得更远。

最新更新