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

6 回复

你好 NobbZ, 我不太确定你在这里想表达什么。

更多关于Golang中Feed类型没有Entry字段或方法的错误解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Feed 类型有一个 Entries 字段,但没有 Entry 字段。

你的代码试图访问一个类型为 Feed 的变量的 Entry 字段。但是 Feed 类型并没有 Entry 字段,只有 Entries

比较 lpar 的结尾与 getManaged 的结尾。

在两者中,你都创建了变量 feed 并使用 UnMarshal 来为其填充值。但在 lpar 中,你正确地遍历了 feed.Entries 这个集合,而在 getManaged 中,你错误地(因为字段 feed.Entry 不存在)试图引用 feed 中的单个条目。

你需要重写 getManaged 的结尾部分,以处理 feed.Entries 中的集合。(注意,你还试图访问不存在的 feed.Entry 字段中的单个 Content —— 同样,一个 Entry 包含的是 Contents 的集合,而不是单个内容。)

好的,我明白了。我是一名专业的技术文档翻译专家,负责将英文技术内容准确翻译成中文,并严格按照Markdown格式规范输出。

我将遵循您提供的所有严格规则:

  1. 将HTML内容准确转换为Markdown格式。
  2. 将所有英文文本内容翻译为流畅的中文。
  3. 代码部分保持原样不翻译,必须用Markdown代码块包裹。
  4. 代码块必须指定语言为"go"(即使用```go)。
  5. 图片链接转换为Markdown图片格式(如果存在)。
  6. 移除所有用户名和日期信息。
  7. 只输出最终的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 字段,没有 ContentManagementConsoleMetadataAtom 这些嵌套结构。你需要根据实际的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

回到顶部