Go语言新手求助:解析xml.gz邮件附件并将XML存入变量
解析XML.GZ邮件附件并将内容存入变量的Go语言实现
嘿,看你已经能把解压后的XML输出到终端了,现在想把内容存到变量里对吧?咱们来调整下代码,轻松搞定这个需求~
首先先纠正几个小问题,再一步步实现存变量的逻辑:
关键修改点说明
- 修复gzip包导入:你之前用了
_ "compress/gzip",这只是初始化包但无法直接调用里面的函数,得改成"compress/gzip"才能使用gzip.NewReader。 - 完善错误处理:原来的代码忽略了很多错误,实际开发里这会埋下隐患,咱们补上所有必要的错误检查。
- 用Buffer存储内容:代替直接输出到终端,用
bytes.Buffer来接收解压后的XML数据,这样就能轻松转成字符串变量。
修改后的完整代码
package main import ( "bytes" "compress/gzip" "fmt" "io" "os" "github.com/DusanKasan/parsemail" ) func main() { fmt.Println("HIII.. THIS IS TESTING") // 打开邮件文件,添加错误处理 reader, err := os.Open("4.raw") if err != nil { fmt.Printf("打开文件失败: %v\n", err) os.Exit(1) } defer reader.Close() // 确保文件句柄被关闭 // 解析邮件 email, err := parsemail.Parse(reader) if err != nil { fmt.Printf("解析邮件失败: %v\n", err) os.Exit(1) } // 遍历所有附件 for _, a := range email.Attachments { // 创建gzip读取器,处理可能的错误 r, err := gzip.NewReader(a.Data) if err != nil { fmt.Printf("创建gzip读取器失败: %v\n", err) continue // 处理失败就跳过当前附件 } defer r.Close() // 确保读取器资源被释放 // 初始化一个Buffer来存储解压后的XML内容 var xmlBuffer bytes.Buffer // 将解压后的内容复制到Buffer中 _, err = io.Copy(&xmlBuffer, r) if err != nil { fmt.Printf("读取解压内容失败: %v\n", err) continue } // 将Buffer中的字节转换成字符串变量 xmlContent := xmlBuffer.String() // 现在你可以随意使用这个变量了,比如打印或者进一步解析XML fmt.Println("===== 解压后的XML内容 =====") fmt.Println(xmlContent) // 如果需要解析XML结构体,可以用encoding/xml包,示例如下: // type YourXMLStruct struct { // // 根据你的XML结构定义字段 // } // var xmlData YourXMLStruct // err = xml.Unmarshal(xmlBuffer.Bytes(), &xmlData) // if err != nil { // fmt.Printf("解析XML结构体失败: %v\n", err) // } } }
额外说明
你之前打印r看到的&{[31 139 ...]}是gzip读取器的内部结构,包含的是压缩状态和原始压缩字节,并不是解压后的内容。只有通过io.Copy把读取器的内容读出来,才能得到真正的XML数据哦~
内容的提问来源于stack exchange,提问作者Avinash Ghadshi
相关产品推荐
相关产品推荐

