l'éditeur php Baicao vous propose une méthode pour obtenir un tableau vide lors de l'analyse XML. Lors du traitement des données XML, nous rencontrons parfois une situation où le nœud est vide. À ce stade, nous devons obtenir un tableau vide pour représenter le nœud. En PHP, vous pouvez obtenir un tableau vide en utilisant une expression XPath ou en utilisant la méthode children() de l'objet SimpleXMLElement. Vous pouvez utiliser des expressions XPath pour obtenir un tableau vide en ajoutant "[]" après le nom du nœud, et utiliser la méthode children() pour obtenir un tableau vide en passant une chaîne vide en paramètre. Ces méthodes peuvent nous aider à obtenir avec précision la valeur d'un tableau vide lors de l'analyse XML.
J'ai été chargé d'écrire un utilitaire go qui accepte un fichier XML, l'analyse et le renvoie sous la forme json.
Voici un exemple de 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>
J'ai écrit le code suivant :
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
Mais malheureusement, cela ne fonctionne pas. Je reçois le message suivant dans la console :
2009/11/10 23:00:00 expected element type <tracks> but have <track>
Qu'est-ce que j'ai fait de mal ? Comment puis-je résoudre ce problème?
Je suppose que je devrais déplacer la discussion vers la réponse, car je pense que vous êtes assez proche. Comme je l'ai mentionné, vous devez vérifier l'erreur renvoyée par xml.unmarshal
. Cela pourrait ressembler à ceci :
if err := xml.unmarshal([]byte(rawxmldata), &tracks); err != nil { panic(err) }
Maintenant que vous disposez de données XML valides dans votre code, nous pouvons générer des erreurs significatives ; après avoir terminé la vérification des erreurs ci-dessus, l'exécution du code produira :
panic: expected element type <tracks> but have <track> goroutine 1 [running]: main.main() /home/lars/tmp/go/main.go:48 +0x12f
Cela arrive à cause d'une petite faute de frappe dans votre structure de données ; dans la définition de la structure track
, vous avez :
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"` }
Vous avez identifié par erreur l'attribut xmlname
属性错误标记为 tracks
,而实际上它应该是 track
comme tracks
alors qu'il devrait l'être
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
Enfin - et ce n'est pas directement lié à la question - vous devez éviter les appels qui nomment des variables comme ceci :
jsondata, err := json.marshal(tracks) if err != nil { panic(err) }
panic()
Vous n'avez pas besoin de quand c'est faux ; c'est juste un moyen pratique de vous débarrasser de votre code.
jq
Après avoir effectué ces modifications, si nous compilons et exécutons le code, nous obtiendrons le résultat (au 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
Notez que vous n'avez même pas besoin de l'élément dans votre structure ; si nous le supprimons complètement, alors nous avons :
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
Ensuite, nous obtenons le résultat (au 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" } } ] }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!