How to unmarshall S3 XML in Go?

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

How to unmarshall S3 XML in Go?

问题

我正在对我的S3存储桶的根目录进行HTTP GET请求,以列出其中的内容。我希望我的应用程序能够解析这些内容,以了解存储桶中有什么。

XML的格式如下:

<?xml
version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Name>my-bucket</Name>
    <Contents>
        <Key>one.json</Key>
    </Contents>
    <Contents>
        <Key>three.json</Key>
    </Contents>
    <Contents>
        <Key>two.json</Key>
    </Contents>
</ListBucketResult>

为了解析它,我尝试使用以下代码:

type S3Content struct {
    Key     string   `xml:"Key"`
}

type S3ListBucketResult struct {
    Contents []S3Content `xml:"Contents"`
}

type HttpS3Response struct {
    ListBucketResult S3ListBucketResult `xml:"ListBucketResult"`
}

resp, _ := http.Get("https://my-bucket.s3.amazonaws.example.com")
body, _ := ioutil.ReadAll(resp.Body)

var parsed HttpS3Response
xml.Unmarshal(body, &parsed)

fmt.Println(parsed.ListBucketResult.Contents)

然而,Contents切片似乎是空的。你知道我做错了什么吗?

英文:

I am making an http GET request on the root directory of my s3 bucket to list the contents. I would like my application to parse the contents to understand what's in the bucket.

The XML looks like this:

&lt;?xml
version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;ListBucketResult xmlns=&quot;http://s3.amazonaws.com/doc/2006-03-01/&quot;&gt;
    &lt;Name&gt;my-bucket&lt;/Name&gt;
    &lt;Contents&gt;
        &lt;Key&gt;one.json&lt;/Key&gt;
    &lt;/Contents&gt;
    &lt;Contents&gt;
        &lt;Key&gt;three.json&lt;/Key&gt;
    &lt;/Contents&gt;
    &lt;Contents&gt;
        &lt;Key&gt;two.json&lt;/Key&gt;
    &lt;/Contents&gt;
&lt;/ListBucketResult&gt;

To parse it I am trying to use this:

	type S3Content struct {
		Key     string   `xml:&quot;Key&quot;`
	}

	type S3ListBucketResult struct {
		Contents []S3Content `xml:&quot;Contents&quot;`
	}

	type HttpS3Response struct {
		ListBucketResult S3ListBucketResult `xml:&quot;ListBucketResult&quot;`
	}

	resp, _ := http.Get(&quot;https://my-bucket.s3.amazonaws.example.com&quot;)
	body, _ := ioutil.ReadAll(resp.Body)

	var parsed HttpS3Response
	xml.Unmarshal(body, &amp;parsed)

	fmt.Println(parsed.ListBucketResult.Contents)

However the Contents slice appears empty. Any idea what I am doing wrong?

答案1

得分: 2

哦,根键不包含在路径中。

type S3Content struct {
    Key string `xml:"Key"`
}

type HttpS3Response struct {
    Contents []S3Content `xml:"Contents"`
}

resp, _ := http.Get("https://my-bucket.s3.amazonaws.example.com")
body, _ := ioutil.ReadAll(resp.Body)

var parsed HttpS3Response
xml.Unmarshal(body, &parsed)

fmt.Println(parsed.Contents)

请注意,这是一个用Go语言编写的代码片段,用于从Amazon S3存储桶中获取内容并解析XML响应。它定义了两个结构体类型:S3ContentHttpS3ResponseS3Content结构体表示S3存储桶中的内容,其中包含一个Key字段表示内容的键。HttpS3Response结构体表示HTTP响应,其中包含一个Contents字段,它是一个S3Content类型的切片。

代码通过HTTP GET请求获取S3存储桶的内容,并将响应的主体读取到body变量中。然后,使用xml.Unmarshal函数将XML响应解析为HttpS3Response类型的parsed变量。最后,代码打印出parsed.Contents,即S3存储桶中的内容列表。

请注意,这只是一个代码片段,可能需要根据实际情况进行适当的修改和完善。

英文:

Oh, the root key isn't included in the path

type S3Content struct {
    Key     string   `xml:&quot;Key&quot;`
}

type HttpS3Response struct {
    Contents []S3Content `xml:&quot;Contents&quot;`
}

resp, _ := http.Get(&quot;https://my-bucket.s3.amazonaws.example.com&quot;)
body, _ := ioutil.ReadAll(resp.Body)

var parsed HttpS3Response
xml.Unmarshal(body, &amp;parsed)

fmt.Println(parsed.Contents)

huangapple
  • 本文由 发表于 2022年6月5日 13:12:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/72504944.html
匿名

发表评论

匿名网友

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

确定