我的代码需要一些帮助。我是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/