文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-02-10 08:09

关注

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时如何获取空数组?的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯