Maison >développement back-end >Golang >Comment obtenir un tableau vide lors de l'analyse XML ?

Comment obtenir un tableau vide lors de l'analyse XML ?

WBOY
WBOYavant
2024-02-10 08:00:101078parcourir

Comment obtenir un tableau vide lors de lanalyse XML ?

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.

Contenu de la question

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?

Solution de contournement

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.marshalEnfin - 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.

jqAprè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"
      }
    }
  ]
}
xmlnameNotez 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"`
}
jqEnsuite, 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer