GOLANG xml 解码

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

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:

 &lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt;
 &lt;FileRetriever&gt;
   &lt;FileList&gt;
       &lt;File name=&quot;Name1&quot; /&gt;
       &lt;File name=&quot;Name2&quot; /&gt;
   &lt;/FileList&gt;
 &lt;/FileRetriever&gt;

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 (
    &quot;encoding/base64&quot;
    &quot;encoding/xml&quot;
    &quot;fmt&quot;
    &quot;net/http&quot;

	&quot;golang.org/x/net/html/charset&quot;

)
type fileRetriever struct {
    Files []file `xml:&quot;FileRetriever&gt;FileList&gt;File&quot;`
}

type file struct {
    Name string `xml:&quot;name,attr&quot;`
}

func Main(){
    retrieve()
}

func retrieve()(retriever *fileRetriever){
	req := ... //set up http.NewRequest()
	client := &amp;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 = &amp;fileRetriever{}

	err = decoder.Decode(&amp;retriever)

	if err != nil {
		fmt.Println(err)
	}

	return retriever, xTidx
}

答案1

得分: 4

根元素会自动解码为您传递给Decode的值,因此您不需要在Files字段标签中提及它。

所以只需将xml:&quot;FileRetriever&gt;FileList&gt;File&quot;更改为xml:&quot;FileList&gt;File&quot;

英文:

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:&quot;FileRetriever&gt;FileList&gt;File&quot; to xml:&quot;FileList&gt;File&quot;.

huangapple
  • 本文由 发表于 2017年4月19日 08:50:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/43484446.html
匿名

发表评论

匿名网友

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

确定