Go xml unmarshal doesn't work unless I remove preceding xml version="1.0" encoding="ISO-8859-1"

huangapple go评论109阅读模式
英文:

Go xml unmarshal doesn't work unless I remove preceding xml version="1.0" encoding="ISO-8859-1"

问题

我已经花了几个小时来弄清楚这个问题,但我不明白为什么它只返回一个空字符串。如果我将响应体剪切并粘贴到一个变量中,并删除 "?xml version="1.0" encoding="ISO-8859-1" ?",它就可以正常工作。

  1. package main
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. )
  8. type entry struct {
  9. XMLName xml.Name `xml:"entry"`
  10. Title string `xml:"title"`
  11. Link string `xml:"link"`
  12. Summary string `xml:"summary"`
  13. Updated string `xml:"updated"`
  14. Catagory string `xml:"catagory"`
  15. ID string `xml:"id"`
  16. }
  17. type Feed struct {
  18. XMLName xml.Name `xml:"feed"`
  19. Title string `xml:"title"`
  20. Entry []entry `xml:"entry"`
  21. }
  22. func main() {
  23. resp, err := http.Get("https://www.sec.gov/cgi-bin/browse-edgar?action=getcurrent&type=4&company=&dateb=&owner=include&start=0&count=2&output=atom")
  24. if err != nil {
  25. fmt.Println("Get sec main xml error: %s", err)
  26. }
  27. defer resp.Body.Close()
  28. body, err := ioutil.ReadAll(resp.Body)
  29. //fmt.Println(string(body))
  30. var feedData Feed
  31. xml.Unmarshal(body, &feedData)
  32. fmt.Println(feedData.Title)
  33. for _, entry := range feedData.Entry {
  34. fmt.Println(entry.ID)
  35. }
  36. }

有人能看出我犯了什么错误吗?感谢任何帮助。

英文:

I've spent a few hours trying to figure this out but I cannot see why this wont return anything but an empty string. If I cut and paste the response body to a variable and remove the ?xml version="1.0" encoding="ISO-8859-1" ? it works fine.

  1. package main
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. )
  8. type entry struct {
  9. XMLName xml.Name `xml:"entry"`
  10. Title string `xml:"title"`
  11. Link string `xml:"link"`
  12. Summary string `xml:"summary"`
  13. Updated string `xml:"updated"`
  14. Catagory string `xml:"catagory"`
  15. ID string `xml:"id"`
  16. }
  17. type Feed struct {
  18. XMLName xml.Name `xml:"feed"`
  19. Title string `xml:"title"`
  20. Entry []entry `xml:"entry"`
  21. }
  22. func main() {
  23. resp, err := http.Get("https://www.sec.gov/cgi-bin/browse-edgar?action=getcurrent&type=4&company=&dateb=&owner=include&start=0&count=2&output=atom")
  24. if err != nil {
  25. fmt.Println("Get sec main xml error: %s", err)
  26. }
  27. defer resp.Body.Close()
  28. body, err := ioutil.ReadAll(resp.Body)
  29. //fmt.Println(string(body))
  30. var feedData Feed
  31. xml.Unmarshal(body, &feedData)
  32. fmt.Println(feedData.Title)
  33. for _, entry := range feedData.Entry {
  34. fmt.Println(entry.ID)
  35. }
  36. }

Can anyone see where I'm making the mistake? Thanks for any assistance.

答案1

得分: 1

根据codefreak提供的链接,答案是由moraes在“Updated answer for 2015 & beyond”中给出的。
更新的工作代码:

  1. package main
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "golang.org/x/net/html/charset"
  6. "net/http"
  7. )
  8. type entry struct {
  9. XMLName xml.Name `xml:"entry"`
  10. Title string `xml:"title"`
  11. Link string `xml:"link"`
  12. Summary string `xml:"summary"`
  13. Updated string `xml:"updated"`
  14. Catagory string `xml:"catagory"`
  15. ID string `xml:"id"`
  16. }
  17. type Feed struct {
  18. XMLName xml.Name `xml:"feed"`
  19. Title string `xml:"title"`
  20. Entry []entry `xml:"entry"`
  21. }
  22. func main() {
  23. resp, err := http.Get("https://www.sec.gov/cgi-bin/browse-edgar?action=getcurrent&type=4&company=&dateb=&owner=include&start=0&count=2&output=atom")
  24. if err != nil {
  25. fmt.Println("Get sec main xml error: %s", err)
  26. }
  27. defer resp.Body.Close()
  28. var feedData Feed
  29. decoder := xml.NewDecoder(resp.Body)
  30. decoder.CharsetReader = charset.NewReaderLabel
  31. err = decoder.Decode(&feedData)
  32. fmt.Println(feedData.Title)
  33. for _, entry := range feedData.Entry {
  34. fmt.Println(entry.ID)
  35. }
  36. }

谢谢!

英文:

from the link provided by codefreak the answer was by moraes in "Updated answer for 2015 & beyond"
Updated working code:

  1. package main
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "golang.org/x/net/html/charset"
  6. "net/http"
  7. )
  8. type entry struct {
  9. XMLName xml.Name `xml:"entry"`
  10. Title string `xml:"title"`
  11. Link string `xml:"link"`
  12. Summary string `xml:"summary"`
  13. Updated string `xml:"updated"`
  14. Catagory string `xml:"catagory"`
  15. ID string `xml:"id"`
  16. }
  17. type Feed struct {
  18. XMLName xml.Name `xml:"feed"`
  19. Title string `xml:"title"`
  20. Entry []entry `xml:"entry"`
  21. }
  22. func main() {
  23. resp, err := http.Get("https://www.sec.gov/cgi-bin/browse-edgar?action=getcurrent&type=4&company=&dateb=&owner=include&start=0&count=2&output=atom")
  24. if err != nil {
  25. fmt.Println("Get sec main xml error: %s", err)
  26. }
  27. defer resp.Body.Close()
  28. var feedData Feed
  29. decoder := xml.NewDecoder(resp.Body)
  30. decoder.CharsetReader = charset.NewReaderLabel
  31. err = decoder.Decode(&feedData)
  32. fmt.Println(feedData.Title)
  33. for _, entry := range feedData.Entry {
  34. fmt.Println(entry.ID)
  35. }
  36. }

Thank you!

huangapple
  • 本文由 发表于 2015年11月19日 14:59:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/33797182.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定