Heim >Backend-Entwicklung >Golang >Wie erhalte ich beim Parsen von XML ein leeres Array?

Wie erhalte ich beim Parsen von XML ein leeres Array?

WBOY
WBOYnach vorne
2024-02-10 08:00:101083Durchsuche

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.

Frageninhalt

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?

Workaround

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

sein sollte:

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.marshalAbschließ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.

jqWenn 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"
      }
    }
  ]
}
xmlnameBeachten 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"`
}
jqDann 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen