将XML转换为CSV

3
我是一个新手,正在尝试编写一个脚本来将SOAP响应(目前存储为xml文件)转换为CSV。以下是我的xml副本。
<?xml version="1.0" encoding="UTF-8" ?>
<Data>
    <Results>
        <Client>
            <ID>72rere341</ID>
        </Client>
        <PartnerKey xsi:nil="true" />
        <PartnerProperties>
            <Name>email</Name>
            <Value>example1@test1.com</Value>
        </PartnerProperties>
        <ID>755454475</ID>
        <ObjectID xsi:nil="true" />
        <UserID>5fd0acfc-6crerfrgrfe6e9a675f65</UserID>
        <ActiveFlag>true</ActiveFlag>
        <Delete>0</Delete>
        <LastSuccessfulLogin>2014-11-07T16:00:46.747</LastSuccessfulLogin>
    </Results>
    <Results>
        <Client>
            <ID>72rere5341</ID>
        </Client>
        <PartnerKey xsi:nil="true" />
        <PartnerProperties>
            <Name>email</Name>
            <Value>example2@test1.com</Value>
        </PartnerProperties>
        <ID>7225483</ID>
        <ObjectID xsi:nil="true" />
        <UserID>example2@test1.com</UserID>
        <ActiveFlag>false</ActiveFlag>
        <Delete>0</Delete>
        <LastSuccessfulLogin>2015-04-29T05:01:27.85</LastSuccessfulLogin>
    </Results>
</Data>

这是我的代码副本。

package main

import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
    "log"
    "os"


)

type AccountUser struct {
    UserID              string
    ActiveFlag          string
    LastSuccessfulLogin string
    //PartnerProperties   Partner `xml:"PartnerProperties"`
}

type Partner struct {
    Name  string
    Value string
}


type Query struct {
    ResultList []AccountUser `xml:"Results"`
}


func main() {
    xmlFile, err := os.Open("ActiveUsers.xml")
    if err != nil {
        fmt.Println("Error opening file:", err)

        return
    }
    defer xmlFile.Close()

    b, err := ioutil.ReadAll(xmlFile)
    if err != nil {
        log.Fatal(err)
    }


    var q Query
    err = xml.Unmarshal(b, &q)
    if err != nil {
        log.Fatal(err)
    }



     file, err := os.Create("result.csv")
    checkError("Cannot create file", err)
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    for _, result := range q.ResultList  {
        err := writer.Write(result)
        checkError("Cannot write to file", err)
    }

}

func checkError(message string, err error) {
    if err != nil {
        log.Fatal(message, err)
    }


}

当我运行这个程序时,出现了以下错误:

./ActiveUsers.go:73:28: 无法将类型为 AccountUser 的 result 用作 writer.Write 的类型 []string 的参数

我感觉可能需要将其转换为字节或其他数据结构,但不确定如何操作。
非常感谢您的指导。

XML在哪里?没有看到XML,没人能帮你。 - Jim Garrison
抱歉,我现在会添加。 - 0xsegfault
@JimGarrison 添加了 - 0xsegfault
@JimGarrison,问题出在写CSV文件上,而不是读取XML文件,你为什么需要看XML文件呢? - Adrian
1个回答

2

csv.Writer是用于将行写入CSV文件的工具,它接收一个字符串切片([]string)作为输入。如果您想将一个struct作为CSV文件中的一行进行写入,那么您需要创建一个[]string,其中包含您想要包含的任何字段,并按照您希望它们在CSV文件中出现的顺序,将它们转换为字符串。

for _, result := range q.ResultList  {
    err := writer.Write([]string{result.UserID, result.ActiveFlag, result.LastSuccessfulLogin})
    checkError("Cannot write to file", err)
}

感谢您解释了这个逻辑。非常顺利地运行了。 - 0xsegfault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接