为了账号安全,请及时绑定邮箱和手机立即绑定

如何用两次手动调用替换简单的两匝循环

如何用两次手动调用替换简单的两匝循环

Go
哈士奇WWW 2023-08-14 17:18:15
这是代码: 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
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超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,以便同级节点不会比其先前的同级节点被推出得更远。


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信