我的代码需要一些帮助。我是Kinda的新手,但是很难解决此错误消息“(类型Feed没有字段或方法Entry)”,我有多个func做不同的事情,我需要创建一些结构,但是我遇到了这个问题。也许我的“fmt.printf”陈述是不正确的,只需要再看一眼即可。如果有人想知道,我将尝试使用IBM API。

package main

import (
    "bytes"
    "crypto/tls"
    "encoding/xml"
    "flag"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/http/cookiejar"
    "text/template"
)

//
// XML parsing structures
//

type Feed struct {
    XMLName xml.Name `xml:"feed"`
    Entries []Entry `xml:"entry"`
}
type Entry struct {
    XMLName  xml.Name  `xml:"entry"`
    Contents []Content `xml:"content"`
}

type Content struct {
    XMLName xml.Name           `xml:"content"`
    Lpar    []LogicalPartition `xml:"http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/ LogicalPartition"`
    //  Console []ManagementConsole `xml:"http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/ Managementconsole"`
}

type LogicalPartition struct {
    XMLName       xml.Name `xml:"http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/ LogicalPartition"`
    PartitionName string
    PartitionID   int
    PartitionUUID string
}
type ManagementConsole struct {
    XMLName xml.Name `xml:"ManagementConsole"`
    HMCUUID string
}

type Metadata struct {
    XMLName xml.Name `xml:"Metadata"`
}

type atom struct {
    XMLName xml.Name `xml:"Atom"`
    AtomID  string   `xml:"AtomID"`
}

//
// HTTP session struct
//

type Session struct {
    client   *http.Client
    User     string
    Password string
    url      string
}

func NewSession(user string, password string, url string) *Session {
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }

    jar, err := cookiejar.New(nil)
    if err != nil {
        log.Fatal(err)
    }

    return &Session{client: &http.Client{Transport: tr, Jar: jar}, User: user, Password: password, url: url}
}

func (s *Session) doLogon() {

    authurl := s.url + "/rest/api/web/Logon"

    // template for login request
    logintemplate := `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <LogonRequest xmlns="http://www.ibm.com/xmlns/systems/power/firmware/web/mc/2012_10/" schemaVersion="V1_1_0">
    <Metadata>
      <Atom/>
    </Metadata>
    <UserID kb="CUR" kxe="false">{{.User}}</UserID>
    <Password kb="CUR" kxe="false">{{.Password}}</Password>
  </LogonRequest>`

    tmpl := template.New("logintemplate")
    tmpl.Parse(logintemplate)
    authrequest := new(bytes.Buffer)
    err := tmpl.Execute(authrequest, s)
    if err != nil {
        log.Fatal(err)
    }

    request, err := http.NewRequest("PUT", authurl, authrequest)

    // set request headers
    request.Header.Set("Content-Type", "application/vnd.ibm.powervm.web+xml; type=LogonRequest")
    request.Header.Set("Accept", "application/vnd.ibm.powervm.web+xml; type=LogonResponse")
    request.Header.Set("X-Audit-Memento", "hmctest")

    response, err := s.client.Do(request)
    if err != nil {
        log.Fatal(err)
    } else {
        defer response.Body.Close()
        if response.StatusCode != 200 {
            log.Fatalf("Error status code: %d", response.StatusCode)
        }
    }
}

func (s *Session) lpar() {
    mgdurl := s.url + "/rest/api/uom/LogicalPartition"
    request, err := http.NewRequest("GET", mgdurl, nil)

    request.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")

    response, err := s.client.Do(request)
    if err != nil {
        log.Fatal(err)
    } else {
        defer response.Body.Close()
        contents, err := ioutil.ReadAll(response.Body)
        if err != nil {
            log.Fatal(err)
        }

        if response.StatusCode != 200 {
            log.Fatalf("Error getting LPAR informations. status code: %d", response.StatusCode)
        }

        var feed Feed
        new_err := xml.Unmarshal(contents, &feed)

        if new_err != nil {
            log.Fatal(new_err)
        }

        fmt.Printf("\t%-10s\t%-40s \n", "partition", "UUID")
        for _, entry := range feed.Entries {
            for _, content := range entry.Contents {
                for _, lpar := range content.Lpar {
                    fmt.Printf("\t%-10s\t%-40s \n", lpar.PartitionName, lpar.PartitionUUID)
                }
            }
        }
    }
}

func (s *Session) getManaged() {
    mgdurl := s.url + "/rest/api/uom/ManagementConsole"
    request, err := http.NewRequest("GET", mgdurl, nil)
    request.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
    response, err := s.client.Do(request)
    if err != nil {
        log.Fatal(err)
    } else {
        defer response.Body.Close()
        contents, err := ioutil.ReadAll(response.Body)
        if err != nil {
            log.Fatal(err)
        }
        if response.StatusCode != 200 {
            log.Fatalf("Error getting HmcUUID informations. status code: %d", response.StatusCode)
        }
        var feed Feed
        new_err := xml.Unmarshal(contents, &feed)
        if new_err != nil {
            log.Fatal(new_err)
        }
        fmt.Printf("AtomID: %v\n", feed.Entry.Content.ManagementConsole.Metadata.Atom.AtomID)
        //fmt.Printf("AtomCreated: %v\n", feed.Entry.Content.ManagementConsole.Metadata.Atom.AtomCreated)

    }

}

最佳答案

feed的类型为Feed(var feed Feed)。 Feed类型定义为:

type Feed struct {
    XMLName xml.Name `xml:"feed"`
    Entries []Entry `xml:"entry"`
}
因此,它具有一个字段Entries,它是Entry的一部分。
您可以按索引(feed.Entries[0])访问该片中的单个元素,也可以遍历所有条目:
for i, entry := range feed.Entries {
    fmt.Println(i, entry)
}
注意:其他所有 slice 均相同,例如Contents中的Entry字段或Lpar中的Content

关于xml - feed.Entry未定义(类型Feed没有字段或方法Entry),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65651358/

10-11 23:15
查看更多