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

Bagaimana untuk mendapatkan tatasusunan kosong apabila menghuraikan XML?

WBOY
WBOYke hadapan
2024-02-10 08:00:101035semak imbas

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>

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

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>

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

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

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"`
}

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"`
}
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)
    }
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"
      }
    }
  ]
}
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"`
}
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"
      }
    }
  ]
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam