亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以在不解析其子元素的情況下流式解析 XML 父元素?

是否可以在不解析其子元素的情況下流式解析 XML 父元素?

Go
慕哥9229398 2022-06-13 15:24:33
給定以下 XML:<Report name="scan_against_stuff">    <ReportHost>        ....    </ReportHost>    <ReportHost>        ....    </ReportHost>    <ReportHost>        ....    </ReportHost>    <ReportHost>        ....    </ReportHost>    <ReportHost>        ....    </ReportHost></Report>我想在 Go 中流式解析這個 XML。特別是,我想流式解析<ReportHost>元素,而不是一次將它們全部加載到內存中。問題是我還想檢索元素的name屬性。<Report>為什么這是個問題?那么我熟悉的流解析方法需要我解析整個<Report>元素,這將包括所有<ReportHost>元素,因為它們是元素的子<Report>元素。有什么方法可以讓我在<Report>不解析子元素的情況下解析父<ReportHost>元素?編輯根據 Volker 的評論,我正在編輯此內容以進行澄清。使用下面的代碼,塊永遠不會else if ty.Local.Name == "ReportHost"觸發,而如果塊被刪除(并更改為),它會觸發。我認為這是因為一旦元素被丟棄,作為其子元素的元素就不再可用于處理。"ty.Local.Name == "Report"else ififReportReportHostparsexml.gotype ReportName struct {    Name string `xml:"name,attr"`}type ReportHost struct{   ....}d := xml.NewDecoder(f)    for {        tok, err := d.Token()        if tok == nil || err == io.EOF {            // EOF means we're done.            break        } else if err != nil {            log.Fatalf("Error decoding token: %s", err)        }        //        switch element := tok.(type) {        case xml.StartElement:            if element.Name.Local == "Report" {                if err = d.DecodeElement(&reportName, &element); err != nil {                    log.Fatalf("Error decoding item: %s", err)                }            else if element.Name.Local == "ReportHost" {                if err = d.DecodeElement(&reportHost, &element); err != nil {                    log.Fatalf("Error decoding item: %s", err)                }            }
查看完整描述

1 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

decode 方法會吞噬元素的所有子元素。要通過元素的子元素進行流式傳輸,請直接訪問元素的屬性,而不是使用 decode。


    switch element := tok.(type) {

    case xml.StartElement:

        if element.Name.Local == "Report" {


            // Look for report name in attributes.

            for _, attr := range element.Attr {

                if attr.Name.Local == "name" {

                    fmt.Println("name =", attr.Value)

                }

            }


        } else if element.Name.Local == "ReportHost" {

            var reportHost ReportHost

            if err = d.DecodeElement(&reportHost, &element); err != nil {

                log.Fatalf("Error decoding item: %s", err)

            }

            fmt.Println("host =", reportHost.Data)

        }

    }


查看完整回答
反對 回復 2022-06-13
  • 1 回答
  • 0 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號