2016-04-13 3 views
0

einen Weg zu verstehen versuchen, benutzerdefinierte Einweiser für XML als strukturiert zu erstellen:Marshal Einfeld in zwei Tags in golang

<Appointment> 
<Date>2004-12-22</Date> 
<Time>14:00</Time> 
</Appointment> 

Ich denke an so etwas wie:

type Appointment struct { 
    DateTime time.Time `xml:"???"` 
} 

Frage ist, was würde ich statt ??? ein einzelnes Feld in zwei verschiedenen XML-Tags gespeichert werden?

+0

Sie wahrscheinlich Ihre eigenen Marshaler erstellen müssen 'xml.Marshaler' zu implementieren, die Pflege der Aufspaltung statt das 'DateTime'-Feld nach' date' und 'time' vor dem Marshalling nach XML. – PieOhPah

Antwort

0

Schnelle Schätzung, können Sie nicht. Sie sollten die xml.Marshaler Schnittstelle mit Ihrem Appointment Typ implementieren ...

2

Complex Marshaling/Unmarshaling Verhalten erfordert in der Regel eine Marschall/Unmarshal Schnittstelle zu erfüllen (dies gilt für XML, JSON und ähnliche Setup-Typen in gehen).

Sie müssen die xml.Marshaler Schnittstelle mit einer MarshalXML() Funktion, so etwas wie die folgenden erfüllen:

package main 

import (
    "encoding/xml" 
    "fmt" 
    "time" 
) 

type Appointment struct { 
    DateTime time.Time 
} 

type appointmentExport struct { 
    XMLName struct{} `xml:"appointment"` 
    Date string `xml:"date"` 
    Time string `xml:"time"` 
} 

func (a *Appointment) MarshalXML(e *xml.Encoder, start xml.StartElement) error { 
    n := &appointmentExport{ 
     Date: a.DateTime.Format("2006-01-02"), 
     Time: a.DateTime.Format("15:04"), 
    } 
    return e.Encode(n) 
} 

func main() { 
    a := &Appointment{time.Now()} 
    output, _ := xml.MarshalIndent(a, "", " ") 
    fmt.Println(string(output)) 
} 

// prints: 
// <appointment> 
//  <date>2016-04-15</date> 
//  <time>17:43</time> 
// </appointment> 
+0

Ja, das ist etwas, was ich getan habe. Nicht, dass es keine gute Lösung wäre, aber ich dachte, es könnte eine einfachere Lösung geben – ArkadyB