英文:
GOLANG xml decoding
问题
在Go语言中,我正在尝试将这个XML解码为"fileRetriever"结构体。我只关心文件名:
<?xml version="1.0" encoding="ISO-8859-1"?>
<FileRetriever>
  <FileList>
      <File name="Name1" />
      <File name="Name2" />
  </FileList>
</FileRetriever>
我认为这段代码很接近,但我似乎找不到错误所在。它没有产生错误,但文件名列表的长度为零:
import (
    "encoding/base64"
    "encoding/xml"
    "fmt"
    "net/http"
    "golang.org/x/net/html/charset"
)
type fileRetriever struct {
    Files []file `xml:"FileRetriever>FileList>File"`
}
type file struct {
    Name string `xml:"name,attr"`
}
func Main(){
    retrieve()
}
func retrieve()(retriever *fileRetriever){
    req := ... //设置http.NewRequest()
    client := &http.Client{}
    rsp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer rsp.Body.Close()
    decoder := xml.NewDecoder(rsp.Body)
    decoder.CharsetReader = charset.NewReaderLabel
    retriever = &fileRetriever{}
    err = decoder.Decode(&retriever)
    if err != nil {
        fmt.Println(err)
    }
    return retriever, xTidx
}
英文:
In Go, I'm trying to decode this XML into the "fileRetriever" struct. I only care about the file names:
 <?xml version="1.0" encoding="ISO-8859-1" ?>
 <FileRetriever>
   <FileList>
       <File name="Name1" />
       <File name="Name2" />
   </FileList>
 </FileRetriever>
I think this code snippet is close, but I can't seem to see where I'm going wrong. It produces no errors, but also a zero-length list of file names:
import (
    "encoding/base64"
    "encoding/xml"
    "fmt"
    "net/http"
	"golang.org/x/net/html/charset"
)
type fileRetriever struct {
    Files []file `xml:"FileRetriever>FileList>File"`
}
type file struct {
    Name string `xml:"name,attr"`
}
func Main(){
    retrieve()
}
func retrieve()(retriever *fileRetriever){
	req := ... //set up http.NewRequest()
	client := &http.Client{}
    rsp, err := client.Do(req)
	if err != nil {
    	log.Fatal(err)
    }
	defer rsp.Body.Close()
	decoder := xml.NewDecoder(rsp.Body)
	decoder.CharsetReader = charset.NewReaderLabel
	retriever = &fileRetriever{}
	err = decoder.Decode(&retriever)
	if err != nil {
		fmt.Println(err)
	}
	return retriever, xTidx
}
答案1
得分: 4
根元素会自动解码为您传递给Decode的值,因此您不需要在Files字段标签中提及它。
所以只需将xml:"FileRetriever>FileList>File"更改为xml:"FileList>File"。
英文:
The root element is automatically decoded into the value you pass to Decode so you don't need to mention it in the Files field tag.
So just change xml:"FileRetriever>FileList>File" to xml:"FileList>File".
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论