php小编百草为您带来解析XML时获取空数组的方法。在处理XML数据时,有时会遇到节点为空的情况,这时候我们需要获取一个空数组来表示这个节点。在php中,可以通过使用xpath表达式或者使用SimpleXMLElement对象的children()方法来获取空数组。使用xpath表达式可以通过在节点名后面加上"[]"来表示获取空数组,而使用children()方法可以通过传递空字符串作为参数来获取空数组。这些方法可以帮助我们在解析XML时准确地获取到空数组的值。
问题内容
我的任务是编写一个 go 实用程序,该实用程序接受 xml 文件,解析它,并以 json 返回它。
下面是 xml 的示例:
登录后复制
我编写了以下代码:
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 := `
`
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 but have
登录后复制
我做错了什么?我该如何解决这个问题?
解决方法
我想我应该将讨论转移到答案,因为我认为你已经非常接近了。正如我提到的,您需要检查 xml.unmarshal
返回的错误。可能看起来像这样:
if err := xml.unmarshal([]byte(rawxmldata), &tracks); err != nil {
panic(err)
}
登录后复制
现在您的代码中已经有了有效的 xml 数据,我们可以生成有意义的错误;完成上述错误检查后,运行代码会产生:
panic: expected element type but have
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时如何获取空数组?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!