Heim >Backend-Entwicklung >Golang >Wie erhalte ich beim Parsen von XML ein leeres Array?
php-Editor Baicao bietet Ihnen eine Methode, um beim Parsen von XML ein leeres Array zu erhalten. Bei der Verarbeitung von XML-Daten kommt es manchmal vor, dass der Knoten leer ist. Zu diesem Zeitpunkt müssen wir ein leeres Array erhalten, um den Knoten darzustellen. In PHP können Sie ein leeres Array erhalten, indem Sie einen XPath-Ausdruck oder die Methode children() des SimpleXMLElement-Objekts verwenden. Sie können XPath-Ausdrücke verwenden, um ein leeres Array zu erhalten, indem Sie „[]“ nach dem Knotennamen hinzufügen, und die Methode children() verwenden, um ein leeres Array zu erhalten, indem Sie eine leere Zeichenfolge als Parameter übergeben. Diese Methoden können uns helfen, beim Parsen von XML den Wert eines leeren Arrays genau zu ermitteln.
Ich wurde beauftragt, ein Go-Dienstprogramm zu schreiben, das eine XML-Datei akzeptiert, sie analysiert und als json zurückgibt.
Hier ist ein Beispiel für XML:
<?xml version="1.0" encoding="utf-8"?> <tracks clid="020"> <track uuid="551" category="s" route="8" vehicle_type="trolleybus" > <point latitude="53.61491" longitude="55.90922" avg_speed="24" direction="270" time="13122022:072116" /> </track> <track uuid="552" category="s" route="6" vehicle_type="trolleybus"> <point latitude="53.68321" longitude="57.90922" avg_speed="42" direction="181" time="13122022:072216" /> </track> </tracks>
Ich habe den folgenden Code geschrieben:
package main import ( "encoding/json" "encoding/xml" "fmt" ) type tracks struct { xmlname xml.name `xml:"tracks" json:"-"` clid string `xml:"clid,attr" json:"clid"` tracks []track `xml:"track" json:"track_list"` } type track struct { xmlname xml.name `xml:"tracks"` uuid string `xml:"uuid,attr" json:"uuid"` category string `xml:"category,attr" json:"category"` route string `xml:"route,attr" json:"route"` vehicletype string `xml:"vehicle_type,attr" json:"vehicle_type"` point point `xml:"point" json:"point"` } type point struct { latitude string `xml:"latitude,attr" json:"latitude"` longitude string `xml:"longitude,attr" json:"longitude"` avgspeed string `xml:"avg_speed,attr" json:"avg_speed"` direction string `xml:"direction,attr" json:"direction"` time string `xml:"time,attr" json:"time"` } func main() { rawxmldata := ` <?xml version="1.0" encoding="utf-8"?> <tracks clid="020"> <track uuid="551" category="s" route="8" vehicle_type="trolleybus"> <point latitude="53.61491" longitude="55.90922" avg_speed="24" direction="270" time="13122022:072116"/> </track> <track uuid="552" category="s" route="6" vehicle_type="trolleybus"> <point latitude="53.68321" longitude="57.90922" avg_speed="42" direction="181" time="13122022:072216"/> </track> </tracks> ` var tracks tracks err := xml.unmarshal([]byte(rawxmldata), &tracks) if err != nil { log.fatal(err) } jsondata, err := json.marshal(tracks) if err != nil { log.fatal(err) } fmt.printf(string(jsondata)) }
go.dev
Aber leider funktioniert es nicht. Ich erhalte in der Konsole folgende Meldung:
2009/11/10 23:00:00 expected element type <tracks> but have <track>
Was habe ich falsch gemacht? Wie kann ich dieses Problem lösen?
Ich denke, ich sollte die Diskussion auf die Antwort verlagern, da ich denke, dass Sie ziemlich nah dran sind. Wie bereits erwähnt, müssen Sie den von xml.unmarshal
zurückgegebenen Fehler überprüfen. Es könnte so aussehen:
if err := xml.unmarshal([]byte(rawxmldata), &tracks); err != nil { panic(err) }
Da Ihr Code nun gültige XML-Daten enthält, können wir nach Abschluss der oben genannten Fehlerprüfung aussagekräftige Fehler generieren. Das Ausführen des Codes führt zu Folgendem:
panic: expected element type <tracks> but have <track> goroutine 1 [running]: main.main() /home/lars/tmp/go/main.go:48 +0x12f
Dies geschieht aufgrund eines kleinen Tippfehlers in Ihrer Datenstruktur; in der Definition der track
-Struktur haben Sie:
type track struct { xmlname xml.name `xml:"tracks"` uuid string `xml:"uuid,attr" json:"uuid"` category string `xml:"category,attr" json:"category"` route string `xml:"route,attr" json:"route"` vehicletype string `xml:"vehicle_type,attr" json:"vehicle_type"` point point `xml:"point" json:"point"` }
Sie haben das Attribut xmlname
属性错误标记为 tracks
,而实际上它应该是 track
fälschlicherweise mit tracks
getaggt, obwohl es
type track struct { xmlname xml.name `xml:"track"` uuid string `xml:"uuid,attr" json:"uuid"` category string `xml:"category,attr" json:"category"` route string `xml:"route,attr" json:"route"` vehicletype string `xml:"vehicle_type,attr" json:"vehicle_type"` point point `xml:"point" json:"point"` }
error
,因为这是错误的内置数据类型的名称。我将修改您对 json.marshal
Abschließend – und das steht nicht in direktem Zusammenhang mit der Frage – sollten Sie Aufrufe vermeiden, die Variablen wie diesen benennen:
jsondata, err := json.marshal(tracks) if err != nil { panic(err) }
panic()
Sie brauchen nicht, wenn es falsch ist; es ist nur eine bequeme Möglichkeit, Ihren Code loszuwerden.
jq
Wenn wir nach diesen Änderungen den Code kompilieren und ausführen, erhalten wir die Ausgabe (im Format
{ "clid": "020", "track_list": [ { "xmlname": { "space": "", "local": "track" }, "uuid": "551", "category": "s", "route": "8", "vehicle_type": "trolleybus", "point": { "latitude": "53.61491", "longitude": "55.90922", "avg_speed": "24", "direction": "270", "time": "13122022:072116" } }, { "xmlname": { "space": "", "local": "track" }, "uuid": "552", "category": "s", "route": "6", "vehicle_type": "trolleybus", "point": { "latitude": "53.68321", "longitude": "57.90922", "avg_speed": "42", "direction": "181", "time": "13122022:072216" } } ] }
xmlname
Beachten Sie, dass Sie das -Element nicht einmal in Ihrer Struktur benötigen; wenn wir es vollständig entfernen, dann haben wir:
type track struct { uuid string `xml:"uuid,attr" json:"uuid"` category string `xml:"category,attr" json:"category"` route string `xml:"route,attr" json:"route"` vehicletype string `xml:"vehicle_type,attr" json:"vehicle_type"` point point `xml:"point" json:"point"` }
jq
Dann erhalten wir die Ausgabe (im Format ): 🎜
{ "clid": "020", "track_list": [ { "uuid": "551", "category": "s", "route": "8", "vehicle_type": "trolleybus", "point": { "latitude": "53.61491", "longitude": "55.90922", "avg_speed": "24", "direction": "270", "time": "13122022:072116" } }, { "uuid": "552", "category": "s", "route": "6", "vehicle_type": "trolleybus", "point": { "latitude": "53.68321", "longitude": "57.90922", "avg_speed": "42", "direction": "181", "time": "13122022:072216" } } ] }
Das obige ist der detaillierte Inhalt vonWie erhalte ich beim Parsen von XML ein leeres Array?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!