Unmarshaling von XML-Elementen mit Attributen und Werten in Go
XML-Elemente enthalten häufig sowohl Attribute als auch Werte. Um solche Elemente erfolgreich in Golang-Strukturen zu entpacken, ist es wichtig, die Rolle der XMLName- und „,chardata“-Annotationen zu verstehen.
Struktur ohne XMLName definieren
Berücksichtigen Sie Folgendes bereitgestelltes XML:
<code class="xml"><thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing></code>
Die entsprechende Struktur ohne XMLName-Feld könnte sein:
<code class="go">type ThingElem struct { Prop int `xml:"prop,attr"` Value float64 `xml:",chardata"` }</code>
Prop ist mit xml:"prop,attr" annotiert, um anzugeben, dass es ein Attribut von ist Dingelement. Der Wert wird mit xml:",chardata" annotiert, um anzugeben, dass er den Inhalt des Elements als Zeichenfolge enthalten soll.
Informationen zu XMLName
XMLName kann dazu verwendet werden Definieren Sie explizit den XML-Tag-Namen einer Struktur. In unserem Fall wird der XML-Tag-Name abgeleitet, da er mit dem Strukturnamen (ThingElem) übereinstimmt. Daher ist XMLName in diesem Szenario nicht erforderlich.
Verwenden einer Wrapper-Struktur
Wenn die XML-Struktur komplexer ist oder mehrdeutig sein könnte, können Sie eine Wrapper-Struktur verwenden um zusätzlichen Kontext bereitzustellen. Wenn das XML beispielsweise mehrere Thing-Elemente innerhalb eines Stammelements hätte:
<code class="xml"><root> <thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing> </root></code>
Sie würden eine Wrapper-Struktur benötigen:
<code class="go">type ThingWrapper struct { T ThingElem `xml:"thing"` }</code>
Hier ist T die eingebettete Struktur, die das darstellt thing-Element.
Überlegungen zum Unmarshaling
Für die bereitgestellten XML-Daten müssen Sie den Leerraum in den Elementwerten berücksichtigen. Da XML standardmäßig keine Leerzeichen beibehält, sollten die Werte gekürzt werden oder die Annotation xml:",innerxml" verwendet werden.
Die resultierende Struktur kann wie folgt entmarshallt werden:
<code class="go">package main import ( "encoding/xml" "fmt" "strings" ) type Root struct { Things []Thing `xml:"thing"` } type Thing struct { Prop int `xml:"prop,attr"` Value float64 `xml:",chardata"` } func main() { data := ` <root> <thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing> </root> ` thing := &Root{} err := xml.Unmarshal([]byte(strings.TrimSpace(data)), thing) if err != nil { fmt.Println(err) return } fmt.Println(thing) }</code>
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich XML mit Attributen und Werten in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!