Golang中Feed类型没有Entry字段或方法的错误解决方法
Golang中Feed类型没有Entry字段或方法的错误解决方法 各位Gopher们好,
我对Go语言还比较陌生,似乎无法理解这个错误信息:“feed.Entry undefined (type Feed has no field or method Entry)”。我已经在下面贴出了我的代码,有哪位Gopher能帮帮我吗?
谢谢大家。
package main
import (
"bytes"
"crypto/tls"
"encoding/xml"
"flag"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/http/cookiejar"
"text/template"
)
//
// XML 解析结构体
//
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 会话结构体
//
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"
// 登录请求模板
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)
// 设置请求头
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)
}
}
更多关于Golang中Feed类型没有Entry字段或方法的错误解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好 NobbZ, 我不太确定你在这里想表达什么。
更多关于Golang中Feed类型没有Entry字段或方法的错误解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Feed 类型有一个 Entries 字段,但没有 Entry 字段。
你的代码试图访问一个类型为 Feed 的变量的 Entry 字段。但是 Feed 类型并没有 Entry 字段,只有 Entries。
好的,我明白了。我是一名专业的技术文档翻译专家,负责将英文技术内容准确翻译成中文,并严格按照Markdown格式规范输出。
我将遵循您提供的所有严格规则:
- 将HTML内容准确转换为Markdown格式。
- 将所有英文文本内容翻译为流畅的中文。
- 代码部分保持原样不翻译,必须用Markdown代码块包裹。
- 代码块必须指定语言为"go"(即使用```go)。
- 图片链接转换为Markdown图片格式(如果存在)。
- 移除所有用户名和日期信息。
- 只输出最终的Markdown文档,不包含任何解释、建议或其他内容。
现在,开始处理您提供的HTML内容。
好的,我想我明白你的意思了。非常感谢你的指导。我现在就着手处理这个问题。
这个错误是因为你在 getManaged() 方法中错误地访问了 feed.Entry,但你的 Feed 结构体定义中只有 Entries 字段(复数形式),没有 Entry 字段。
在你的 Feed 结构体中:
type Feed struct {
XMLName xml.Name `xml:"feed"`
Entries []Entry `xml:"entry"` // 这是切片,不是单个Entry
}
Entries 是一个 Entry 类型的切片,所以你需要通过索引来访问,比如 feed.Entries[0]。修改 getManaged() 方法中的代码:
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)
}
// 修改这里:使用 feed.Entries 而不是 feed.Entry
if len(feed.Entries) > 0 {
// 假设第一个entry包含需要的数据
entry := feed.Entries[0]
// 注意:你的Entry结构体中没有Content.ManagementConsole.Metadata.Atom这些字段
// 你需要根据实际的XML结构调整
for _, content := range entry.Contents {
// 处理content数据
fmt.Printf("Content: %v\n", content)
}
}
}
}
另外,你的 Entry 结构体目前只定义了 Contents 字段,没有 Content、ManagementConsole、Metadata、Atom 这些嵌套结构。你需要根据实际的XML响应来调整结构体定义。例如:
type Entry struct {
XMLName xml.Name `xml:"entry"`
Content struct {
XMLName xml.Name `xml:"content"`
ManagementConsole struct {
XMLName xml.Name `xml:"ManagementConsole"`
Metadata struct {
XMLName xml.Name `xml:"Metadata"`
Atom struct {
XMLName xml.Name `xml:"Atom"`
AtomID string `xml:"AtomID"`
AtomCreated string `xml:"AtomCreated,omitempty"`
} `xml:"Atom"`
} `xml:"Metadata"`
} `xml:"ManagementConsole"`
} `xml:"content"`
}
这样你才能正确访问 feed.Entries[0].Content.ManagementConsole.Metadata.Atom.AtomID。


