2017-11-16 6 views
3

Ich bin neu zu gehen und zu versuchen, ein Skript zu schreiben, um eine SOAP-Antwort (derzeit als XML-Datei gespeichert) zu konvertieren und in CSV zu konvertieren.Konvertieren von XML in CSV

Hier ist eine Kopie meines xml

<?xml version="1.0" encoding="UTF-8" ?> 
<Data> 
    <Results> 
     <Client> 
      <ID>72rere341</ID> 
     </Client> 
     <PartnerKey xsi:nil="true" /> 
     <PartnerProperties> 
      <Name>email</Name> 
      <Value>[email protected]</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>[email protected]</Value> 
     </PartnerProperties> 
     <ID>7225483</ID> 
     <ObjectID xsi:nil="true" /> 
     <UserID>[email protected]</UserID> 
     <ActiveFlag>false</ActiveFlag> 
     <Delete>0</Delete> 
     <LastSuccessfulLogin>2015-04-29T05:01:27.85</LastSuccessfulLogin> 
    </Results> 
</Data> 

Hier ist eine Kopie meines Code ist

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) 
    } 


} 

Als ich das laufen, ich diesen Fehler:

./ActiveUsers.go:73:28: cannot use result (type AccountUser) as type []string in argument to writer.Write

I Ich habe das Gefühl, ich könnte dies in Bytes oder eine andere Datenstruktur umwandeln, aber ich bin mir nicht sicher, wie ich das machen soll.

Ich werde alle Hinweise zu diesem Thema schätzen.

+0

Wo ist das XML? Niemand kann Ihnen helfen, ohne das XML zu sehen –

+0

Entschuldigungen werden jetzt hinzugefügt –

+0

@JimGarrison hinzugefügt –

Antwort

2

csv.Writer schreibt Zeilen in eine CSV-Datei, die sie als ein Stück Strings erhält ([]string). Wenn Sie eine struct als Zeile in eine CSV-Datei schreiben möchten, müssen Sie eine []string mit allen Feldern erstellen, die in Strings konvertiert werden sollen, in der Reihenfolge, in der sie in Spalten in der CSV-Datei angezeigt werden sollen, zB:

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

Danke für die Erklärung der Logik dahinter. Lief wie am Schnürchen –