解析XML时如何获取空数组?

2024年 2月 10日 102.7k 0

解析xml时如何获取空数组?

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)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论