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.
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?
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
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.marshal
Akhir 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.
jq
Selepas 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" } } ] }
xmlname
Perhatikan 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"` }
jq
Kemudian 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!