Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Go Discussion :

Go convertisseur xml


Sujet :

Go

  1. #1
    Futur Membre du Club
    Go convertisseur xml
    Bonjour à tous,

    Je suis actuellement en train de reprendre la programmation et je me suis lancer dans le go. Je suis actuellement sur un projet d'un convertisseur txt to XML à réaliser. Et je suis bloqué ici : voir ligne 29
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package main
     
     
    import (
    	"encoding/xml"
    	"fmt"
    	"os"
    )
     
    type PPSImport struct {
    	XMLName          xml.Name         `xml:"PPSImport"`
    	Version string `xml:",attr"`
    	ProductionOrders ProductionOrders `xml:"ProductionOrders"`
    }
    type ProductionOrders struct {
    	XMLName xml.Name `xml:"ProductionOrders"`
    	ProductionOrder ProductionOrder `xml:"ProductionOrder"`
    }
    type ProductionOrder struct {
    	XMLName xml.Name `xml:"ProductionOrder"`
    	OrderNo string `xml:",attr"`
     
    }
     
     
    func ExampleMarshalIndent() {
     
     
    	w := &PPSImport{Version : "1.1", ProductionOrders : ProductionOrder{OrderNo:string()var}}
     
    	output2, err := xml.MarshalIndent(w, "  ", "    ")
    	if err != nil {
    		fmt.Printf("error: %v\n", err)
    	}
     
     
    	fmt.Println("\n")
    	os.Stdout.Write(output2)


    Ce que je comprend pas c'est comment descendre dans mes nœuds pour modifier "OrderNo"
    Il faudrait implémenter mon interface 'w' avec les autre nœuds.
    Je ne trouve pas la solution que ce soit par mes recherches ou sur internet.

    Merci pour ceux qui prendront le temps de regarder de d'y répondre.

  2. #2
    Membre habitué
    Désolé pour le temps de réponse, je ne traîne pas souvent par ici (peut-être que je devrais, pour aider un coup)

    Le problème vient dans ta manière d'encapsuler les struct/variables.
    Quel paramètre veux-tu mettre dans le OrderNo?

    Pour t'aider, tu peux déplier tes structs si tu n'arrives pas à voir le problème.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	w := &PPSImport{
    		Version: "1.1",
    		ProductionOrders: ProductionOrder{
    			OrderNo: string()var,
    		},
    	}


    On peut voir que tu essayes de mettre un "string()var" dans OrderNo, ce qui ne veut rien dire en Go.
    "string()" permet de caster un type en string (souvent utilisé pour transformer un slice de byte ([]byte) en string (exemple : string(monSliceDeByte))
    var permet de déclarer une variable, mais tout seul, ça ne fait rien

    Si tu veux mettre une variable directement, genre une chaîne, passe lui juste le nom de ta variable, exemple:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	maString := "ma string"
    	w := &PPSImport{
    		Version: "1.1",
    		ProductionOrders: ProductionOrder{
    			OrderNo: maString,
    		},
    	}


    Ou si c'est un slice de byte (un slice c'est un tableau dynamique)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	monSlice := []byte{64, 65, 66}
    	w := &PPSImport{
    		Version: "1.1",
    		ProductionOrders: ProductionOrder{
    			OrderNo: string(monSlice),
    		},
    	}

  3. #3
    Membre habitué
    Autres commentaires :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    fmt.Println("\n")

    Ça va imprimer 2 sauts de lignes, 1 pour le fmt.Println() lui-même, et 1 pour le "\n".

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    os.Stdout.Write(w)

    Peut être remplacé par un fmt.Print(w). fmt.PrintXXX écrit dans os.Stdout par défaut.
    Si tu veux écrire dans os.Stderr, tu peux faire un fmt.Fprint(os.Stderr, w) par exemple.

    La correction complète : https://play.golang.org/p/SM_cYzvVCcN