Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk mendapatkan tatasusunan kosong apabila menghuraikan XML?

Bagaimana untuk mendapatkan tatasusunan kosong apabila menghuraikan XML?

WBOY
Lepaskan: 2024-02-10 08:00:10
ke hadapan
1077 orang telah melayarinya

Bagaimana untuk mendapatkan tatasusunan kosong apabila menghuraikan XML?

editor php Baicao membawakan anda kaedah untuk mendapatkan tatasusunan kosong semasa menghuraikan XML. Semasa memproses data XML, kadangkala kita menghadapi situasi di mana nod kosong Pada masa ini, kita perlu mendapatkan tatasusunan kosong untuk mewakili nod. Dalam PHP, anda boleh mendapatkan tatasusunan kosong dengan menggunakan ungkapan xpath atau dengan menggunakan kaedah children() objek SimpleXMLElement. Anda boleh menggunakan ungkapan xpath untuk mendapatkan tatasusunan kosong dengan menambahkan "[]" selepas nama nod, dan gunakan kaedah children() untuk mendapatkan tatasusunan kosong dengan menghantar rentetan kosong sebagai parameter. Kaedah ini boleh membantu kami mendapatkan nilai tatasusunan kosong dengan tepat apabila menghuraikan XML.

Kandungan soalan

Saya ditugaskan untuk menulis utiliti go yang menerima fail xml, menghuraikannya dan mengembalikannya sebagai json.

Berikut ialah contoh 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>
Salin selepas log masuk

Saya menulis kod berikut:

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

Salin selepas log masuk

go.dev

Tetapi, malangnya, ia tidak berkesan. Saya mendapat mesej berikut dalam konsol:

2009/11/10 23:00:00 expected element type <tracks> but have <track>
Salin selepas log masuk

Apa salah saya? Bagaimanakah saya boleh menyelesaikan masalah ini?

Penyelesaian

Saya rasa saya patut mengalihkan perbincangan kepada jawapan, kerana saya rasa anda agak rapat. Seperti yang saya nyatakan, anda perlu menyemak ralat yang dikembalikan oleh xml.unmarshal . Ia mungkin kelihatan seperti ini:

if err := xml.unmarshal([]byte(rawxmldata), &tracks); err != nil {
        panic(err)
    }
Salin selepas log masuk

Sekarang anda mempunyai data xml yang sah dalam kod anda, kami boleh menjana ralat yang bermakna; selepas menyelesaikan semakan ralat di atas, menjalankan kod akan menghasilkan:

panic: expected element type <tracks> but have <track>

goroutine 1 [running]:
main.main()
        /home/lars/tmp/go/main.go:48 +0x12f
Salin selepas log masuk

Ini berlaku kerana kesilapan kecil dalam struktur data anda; dalam definisi struktur track, anda mempunyai:

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"`
}
Salin selepas log masuk

Anda silap tentukan atribut xmlname 属性错误标记为 tracks,而实际上它应该是 track sebagai jejak apabila ia sepatutnya

:

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"`
}
Salin selepas log masuk
error,因为这是错误的内置数据类型的名称。我将修改您对 json.marshalAkhir sekali - dan ini tidak berkaitan secara langsung dengan soalan - anda harus mengelakkan panggilan yang menamakan pembolehubah

seperti ini:

jsondata, err := json.marshal(tracks)
    if err != nil {
        panic(err)
    }
Salin selepas log masuk
panic()Anda tidak perlu

apabila ia salah; ia hanyalah cara yang mudah untuk menyingkirkan kod anda.

jqSelepas membuat perubahan ini, jika kita menyusun dan menjalankan kod, kita akan mendapat output (dalam 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"
      }
    }
  ]
}
Salin selepas log masuk
xmlnamePerhatikan bahawa anda tidak memerlukan elemen

dalam struktur anda; jika kami mengeluarkannya sepenuhnya, maka kami mempunyai:

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"`
}
Salin selepas log masuk
jqKemudian kita mendapat output (dalam 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"
      }
    }
  ]
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mendapatkan tatasusunan kosong apabila menghuraikan XML?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan