php小編百草為您帶來解析XML時取得空數組的方法。在處理XML資料時,有時會遇到節點為空的情況,這時候我們需要取得一個空數組來表示這個節點。在php中,可以透過使用xpath表達式或使用SimpleXMLElement物件的children()方法來取得空數組。使用xpath表達式可以透過在節點名後面加上"[]"來表示取得空數組,而使用children()方法可以透過傳遞空字串作為參數來取得空數組。這些方法可以幫助我們在解析XML時準確地取得到空數組的值。
我的任務是編寫一個 go 實用程序,該實用程序接受 xml 文件,解析它,並以 json 返回它。
下面是 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>
我寫了以下程式碼:
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
但是,不幸的是,它不起作用。我在控制台中得到以下資訊:
2009/11/10 23:00:00 expected element type <tracks> but have <track>
我做錯了什麼?我該如何解決這個問題?
我想我應該將討論轉移到答案,因為我認為你已經非常接近了。正如我所提到的,您需要檢查 xml.unmarshal
傳回的錯誤。可能看起來像這樣:
if err := xml.unmarshal([]byte(rawxmldata), &tracks); err != nil { panic(err) }
現在您的程式碼中已經有了有效的 xml 數據,我們可以產生有意義的錯誤;完成上述錯誤檢查後,執行程式碼會產生:
panic: expected element type <tracks> but have <track> goroutine 1 [running]: main.main() /home/lars/tmp/go/main.go:48 +0x12f
發生這種情況是因為您的資料結構中存在一個小拼字錯誤;在 track
結構的定義中,您有:
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"` }
您將 xmlname
屬性錯誤標記為 tracks
,但實際上它應該是 track
:
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
的調用,如下所示:
jsondata, err := json.marshal(tracks) if err != nil { panic(err) }
錯誤時您不需要 panic()
;這只是擺脫程式碼的一種便捷方法。
完成這些變更後,如果我們編譯並執行程式碼,我們將得到輸出(格式為 jq
):
{ "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
元素;如果我們完全刪除它,那麼我們就有:
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
):
{ "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" } } ] }
以上是解析XML時如何取得空數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!