我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

免责声明:

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

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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

php小编百草为您带来解析XML时获取空数组的方法。在处理XML数据时,有时会遇到节点为空的情况,这时候我们需要获取一个空数组来表示这个节点。在php中,可以通过使用xpath表达式或者使用SimpleXMLElement对象的childr
解析XML时如何获取空数组?
2024-02-10

PHP如何获取 XML 解析器错误代码

本文详细介绍了PHP中获取XML解析器错误代码的方法,包括xml_get_error_code()和xml_error_string()函数的使用。通过获取和处理错误代码,开发者可以识别和纠正XML解析过程中的错误,从而确保准确可靠的数据处理。
PHP如何获取 XML 解析器错误代码
2024-04-02

Python如何获取 XML 解析器错误代码

PythonXML解析器xml.etree.ElementTree提供获取解析错误代码的功能。通过异常对象的code属性,可以访问错误代码。常见的代码包括:1(打开文件失败)、2(语法错误)等。处理错误时,可采取措施,如打印消息、记录错误或重试解析。了解解析器特定错误代码和确保XML文档有效性非常重要。
Python如何获取 XML 解析器错误代码
2024-04-02

Java如何获取 XML 解析器错误代码

本文介绍了如何在Java中获取XML解析器错误代码,以帮助解决XML解析错误。使用SAXParser或DOMParser时,你可以通过getErrorCode()方法获取错误代码。本文还提供了常见的XML解析器错误代码及其描述,并指导你根据错误代码采取适当的措施。
Java如何获取 XML 解析器错误代码
2024-04-02

PHP如何获取 XML 解析器的当前列号

PHP中的xml_get_current_column_number()函数可获取XML解析器的当前列号,表示字符流中当前解析位置。该函数仅在PHP5.0.0及更高版本中可用,在PHP8.0.0中已弃用,建议使用libxml_get_current_column_number()函数代替。
PHP如何获取 XML 解析器的当前列号
2024-04-02

PHP如何获取 XML 解析器的错误描述

本文介绍了PHP中获取XML解析器错误描述的多种方法,包括libxml_get_last_error()、libxml_get_errors()、xml_get_error_code()和xml_error_string()。这些方法可返回错误代码、消息和源行信息,帮助程序员准确识别和调试XML解析问题。
PHP如何获取 XML 解析器的错误描述
2024-04-02

Java如何获取 XML 解析器的错误描述

本文详细介绍了在Java中解析XML时获取解析器错误描述的方法。可使用SAXParseException类获取错误消息、系统标识符、行号和列号。也可以使用DocumentBuilderFactory设置SAXErrorHandler,该对象提供错误处理和描述信息。此外,还可以使用TransformerFactory设置ErrorListener来处理XSLT转换错误。
Java如何获取 XML 解析器的错误描述
2024-04-02

Python如何获取 XML 解析器的当前行号

Python提供了便捷的方法获取XML解析器的当前行号,如getLineNumber()方法。此外,还可通过使用SAX解析器或其他高级解析技术获得行号信息。了解这些方法有助于调试和理解XML结构。
Python如何获取 XML 解析器的当前行号
2024-04-02

Java如何获取 XML 解析器的当前行号

Java获取XML解析器当前行号指南在Java中处理XML文档时,准确获取正在解析的行号非常重要。本文提供了三种方法:方法1:使用Locator对象注册一个ContentHandler,该ContentHandler接受Locator参数,其中包含getLineNumber()方法。方法2:使用DTDHandler对象注册一个DTDHandler,它提供了一个startDTD()方法,其中可以获取Locator对象。方法3:使用自定义ContentHandler重写startElement()方法以获取L
Java如何获取 XML 解析器的当前行号
2024-04-02

PHP如何获取 XML 解析器的当前行号

PHP中使用xml_get_current_line_number函数获取XML解析器当前行号。该函数在解析过程中有效,返回解析器当前所在行号。它有助于识别解析错误的位置,可与xml_error_string函数结合使用以获取更详细的错误信息。在大型或复杂的XML文档中使用此函数可以帮助进行调试。
PHP如何获取 XML 解析器的当前行号
2024-04-02

Java如何获取 XML 解析器的当前列号

Java中获取XML解析器的当前列号有助于精确进行错误处理和调试。有两种方法:getColumnNumber()方法可返回当前解析事件的列号;Location接口提供更详细的位置信息,包括列号。getColumnNumber()方法更简单,适用于只需要列号的情况;Location接口适用于需要更精确定位错误的情况。
Java如何获取 XML 解析器的当前列号
2024-04-02

Python如何获取 XML 解析器的当前列号

Pythonxml.etree.ElementTree模块的getprevious()方法可获取XML解析器的当前列号,即解析器在当前事件中的列号。通过遍历XML文档,开发者可以使用该方法获取各个元素的列号。列号表示字符在当前行中的位置,与字符偏移量不同。替代方法包括使用lxml库或正则表达式。
Python如何获取 XML 解析器的当前列号
2024-04-02

Python如何获取 XML 解析器的错误描述

在Python中解析XML时,若遇到错误,可使用xml.etree.ElementTree模块获取错误描述。该模块抛出的ParseError异常提供message属性,包含错误信息。此外,str()函数、traceback模块的format_exc()函数也可用于获取错误描述。及时处理错误对于保持代码健壮性至关重要,可通过打印消息、记录错误、重新引发异常或中止程序等方式进行处理。
Python如何获取 XML 解析器的错误描述
2024-04-02

Java中documentHelper解析xml获取想要的数据

本文主要介绍了Java中documentHelper解析xml获取想要的数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-01

Go语言如何获取 XML 解析器错误代码

本文讲解了Go语言中获取XML解析器错误代码的方法。XML解析器错误代码可通过xml.SyntaxError类型获取,该类型包含Code和Line字段,分别表示错误代码和错误行号。错误代码含义如下:语法错误、无效字符、无效令牌、未闭合声明等。获取错误代码可以使用xml.Unmarshal或xml.Parse函数。
Go语言如何获取 XML 解析器错误代码
2024-04-02

C语言如何获取 XML 解析器错误代码

本文介绍了如何使用libxml2和expat库在C语言中获取XML解析器错误代码。还提供了使用其他库和常见错误代码的简要说明。通过获取错误代码,应用程序可以诊断XML解析错误并相应地处理它们。
C语言如何获取 XML 解析器错误代码
2024-04-02

Java如何把 XML 数据解析到数组中

Java解析XML数据到数组Java中解析XML数据到数组可以使用DOM或SAX解析器。DOM解析DOM解析器将整个XML文档加载到内存中,转换为树形结构,便于访问文档的任何部分。SAX解析SAX解析器以流式方式解析XML文档,内存开销小,适合处理大型文档。它触发解析事件,由程序员处理事件并提取数据。选择解析器选择解析器时考虑因素:文档大小:SAX解析器更适合大型文档。内存开销:DOM解析器内存开销大。处理需求:DOM解析器适合访问特定部分,SAX解析器适合处理流式数据。
Java如何把 XML 数据解析到数组中
2024-04-02

PHP如何把 XML 数据解析到数组中

本文介绍了PHP解析XML数据到数组的两种方法:DOM和SimpleXML。DOM采用树状模型,提供更多结构控制。示例解析代码为:$xml=newDOMDocument();$xml->load("path/to/xml.xml");$items=[];foreach($root->childNodesas$itemNode){$item=[];foreach($itemNode->childNodesas$childNode){$item[$childNode->nodeName
PHP如何把 XML 数据解析到数组中
2024-04-02

Python如何把 XML 数据解析到数组中

解析XML数据到数组使用Python解析XML并将其存储在数组中,有以下常用方法:ElementTree库:简单且直观,适用于小型XML文档。lxml库:功能强大,解析速度快,适合大型XML文档。内置函数xml.dom.minidom:适用于较小的XML文档,提供基本解析功能。选择合适的方法取决于文档大小、所需速度和功能。本文详细介绍了每种方法的步骤,包括将数据解析到数组的示例代码。通过了解这些技术,您可以有效地解析XML数据并将其转换为结构化的数组。
Python如何把 XML 数据解析到数组中
2024-04-02

Java如何获取 XML 解析器的当前字节索引

Java中获取XML解析器的当前字节索引的方法包括使用Locator接口或XMLReader类。Locator接口与SAX2.0兼容,提供更多信息,如行号。XMLReader类与SAX1.0兼容,需要强制转换getProperty方法返回的对象。本文提供了使用Locator接口获取字节索引的示例,展示了如何处理大型或复杂的XML文档,确定解析位置至关重要。
Java如何获取 XML 解析器的当前字节索引
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录