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
Libérer: 2024-02-10 08:00:10
avant
1077 Les gens l'ont consulté

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>
Copier après la connexion

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))
}

Copier après la connexion

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>
Copier après la connexion

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)
    }
Copier après la connexion

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
Copier après la connexion

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"`
}
Copier après la connexion

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"`
}
Copier après la connexion
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)
    }
Copier après la connexion
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"
      }
    }
  ]
}
Copier après la connexion
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"`
}
Copier après la connexion
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"
      }
    }
  ]
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal