在 Go 中解组 XML 元素的异构列表

2023-12-14

我有一个像这样的 XML 文档:

<val>
<alpha β='γ'/>
<α δ='ε'/>
(a whole bunch of the above, in random order)
</val>

换句话说,是一个异构列表。我想使用 Go 来解组它encoding/xml包裹。我怎样才能做到这一点?


您无法在 Go 中对此类 XML 文档进行建模,也无法将其解组为interace{},所以我建议事件驱动为此进行解析。

这种事件驱动的解析意味着当您解析 XML 文档(的标记)时,您会收到诸如“遇到开始元素”或“遇到结束元素”之类的事件(当然还有元素的详细信息),并且这些事件控制程序流程(根据它们分支和/或更改内部状态)。

下面的例子将向您展示其原理。它不处理更复杂的 XML,因为我希望示例简短,但该技术可用于解析任何 XML 文档。

创建一个xml.Decoder using xml.NewDecoder(),并通过调用解析 XML 的内容Decoder.Token()重复(循环)。

里面的元素<val>将被收集在类型切片中[]Entry:

type Entry struct {
    Name  string
    Attr  string
    Value string
}

func main() {
    decoder := xml.NewDecoder(strings.NewReader(src))

    entries := []Entry{}
    for {
        t, err := decoder.Token()
        if err != nil {
            if err != io.EOF {
                fmt.Println(err)
            }
            break
        }
        if se, ok := t.(xml.StartElement); ok && len(se.Attr) > 0 {
            entries = append(entries, Entry{
                Name:  se.Name.Local,
                Attr:  se.Attr[0].Name.Local,
                Value: se.Attr[0].Value,
            })
        }
    }

    fmt.Printf("%+v\n", entries)
}

const src = `<val>
<alpha β='γ'/>
<α δ='ε'/>
<x y='z'/>
</val>`

输出(尝试一下去游乐场):

[{Name:alpha Attr:β Value:γ} {Name:α Attr:δ Value:ε} {Name:x Attr:y Value:z}]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Go 中解组 XML 元素的异构列表 的相关文章

  • 将 Protobuf 消息持久保存到数据库

    保存使用 protobuf3 定义的数据的正确方法是什么 我使用 golang 和 Java 两者都支持 ORM 在 java 中使用 Hibernate 在 golang 中使用 gorm 这两个地方我都需要将生成的代码转换为相应的实体模
  • 运行时错误:分配给 nil 映射中的条目

    我正在尝试生成一个地图 然后将其转换为 yaml 文件 如下所示 uid kasi cn Chaithra street fkmp nandan cn Chaithra street fkmp remya cn Chaithra stree
  • 用于选择具有公共属性的所有节点的 XPath 表达式

    我正在读的一本关于 XML 的书说 要选择 XML 文件中具有特定属性的所有节点 请使用以下语法 attribute 我不明白的是为什么需要星号 据我了解 表达式 选择根节点的所有后代 那么 例如 lang 不会选择具有名为 lang 属性
  • XSD 序列显示为不明确

    我有一个 XSD 它是从 RELAX NG 模式转换而来的 其中有一些我正在尝试修复的错误 我遇到的最大问题如下
  • 整洁的标签后没有换行符

    您好 我有以下输入 p Hi span you span p 我想将其视为 XML 我使用以下选项在命令行上运行 Tidy input xml yes output xml yes indent no 我的输出是这样的 p Hi span
  • 解组此 xml 时遇到问题

    尝试了解如何在 Go 中解组 XML 通读多个示例和 stackoverflow 问题 我想要的是一个包含系统上安装的所有补丁的切片 我什至无法解组补丁 没有错误 只是一个空切片 可能做的事情基本上是错误的 提前感谢您的任何建议
  • 如何在Postgresql时间戳中存储Golang time.time?

    我可以知道如何存储time timePostgresql 中的对象 例如 SQL 查询 INSERT INTO UserAccount email login time VALUES email protected cdn cgi l em
  • 从sql server 2005中的列中获取查询的xml节点

    我有一个包含 2 列的表 第一个是带有主键的整数列 第二个是带有数据的 xml 列 数据列包含xml如下
  • 在 XSD 架构中定义 XML 元素的别名

    是否有 XSD 语言支持或技巧 例如通过预处理器 来定义 XML 元素的别名 我想为架构中的所有元素添加别名 以便为 XML 文档的更神秘但网络带宽效率更高的版本创建一个选项 例如 我想定义一个名称 例如IRQ作为元素的别名Interrup
  • http:多余的response.WriteHeader调用

    我有一个HandleFunc 如果成功的话 我希望 显然 能够 sent a 200回复 在回复中写一条信息性消息 但是以下代码片段 在快乐路径中执行 if fullRun w Write byte successMsg w WriteHe
  • 究竟要消化什么并在 XMLDSIG 上签名以及如何进行? (或者,OSX 本机客户端与服务器上计算的 XMLDSIG 不匹配)

    我正在尝试使用封装签名 sha1 摘要和 rss sha1 签名按照 XMLDSIG 规范对 xml 文档进行签名 并且服务器不断返回 297 拒绝 签名与计算的 结果 不匹配 297 Rejeicao Assinatura difere
  • 如何最大限度地减少 Go 中的垃圾收集?

    有时您可能想避免 最小化垃圾收集器 所以我想确定如何做到这一点 我认为下一个是正确的 在函数的开头声明变量 使用数组代替切片 还有吗 为了最大限度地减少 Go 中的垃圾收集 您必须最大限度地减少堆分配 为了最大限度地减少堆分配 您必须了解分
  • 设置元素的命名空间属性

    我正在尝试用 Java 创建一个包含以下元素的 XML 文档
  • setContentView 上的另一个资源$NotFoundException

    Stack Overflow 上有很多 Resources NotFoundException 问题 我已经查看了它们并尝试了各种建议 但均无济于事 我有一个完美的工作布局来显示一些图形 下面有一些按钮 我修改了一些按钮并开始出现此错误 我
  • Codemirror光标位置偏移

    我正在使用代码镜像在网页中显示 突出显示和编辑 xml 但我遇到了光标位置偏离插入位置的问题 因此 如果从闪烁光标所在的位置删除字符 则删除之前的字符您期望的那个会被删除 我假设它与我当前页面存在 css 冲突 因为它在我的页面之外运行良好
  • C# 中的高级替换

    我喜欢用 C 替换 xml 字符串 中的一些属性 示例 XML
  • VS 2012 语法高亮

    我有 2 台计算机运行 VS 2012 pro 但它们都没有像 VS2010 那样显示基于 XML 的文件的任何突出显示或着色 我安装的唯一快捷版工具是 SQL 2012 所以我不认为这是问题所在 其中一台计算机上从未安装过 WebMatr
  • 如何将文档类型添加到 XDocument?

    我有一个现有的 XDocument 对象 我想向其中添加 XML 文档类型 例如 XDocument doc XDocument Parse a test a 我可以使用以下命令创建 XDocumentType XDocumentType
  • 如何使用注释从类的属性值派生 xml 元素名称?

    我有 具有 id 值和名称的属性 我可以使用 XmlElement XmlArray C 注释用一个类来表示所有这些吗 我想从类属性派生 xml 元素名称name 我的课程看起来像 public class Property public
  • jQuery 自动完成 - xml 跨站点请求

    我的自动完成功能的 XML 提要位于另一台服务器上 是否有客户端 javascript 方法来获取此 XML 文档 我知道我可以使用 php jsp 等创建代理 但我需要在所有客户端完成此操作 这就是我现在调用该文件的方式 该文件仅在同一域

随机推荐

  • 对 WCF 行为扩展进行单元测试

    这真让我抓狂 我有一个扩展 如果出现错误 我们可以用它来更改请求的内容响应 基本上 如果一切正常 它会正常序列化为 JSON 但如果我们收到未处理的异常 我们会根据不同的对象进行序列化 我们需要围绕此进行单元测试 但我不知道如何编写它们 验
  • UITableView 自定义单元格图像在滚动后消失。

    我正在创建我的开放网格视图 我创建了一个自定义单元格 如下所示 我像这样处理填充它 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexP
  • android LoginButton.setFragment 中的 facebook 登录

    我的 LogginButton 有问题 LoginButton authButton LoginButton v findViewById R id authButton authButton setFragment this 我使用的片段
  • 从 $request_body 记录 POST 数据

    我的配置设置可以处理一堆 GET 请求 这些请求呈现的像素可以很好地处理分析和解析查询字符串以进行日志记录 使用额外的第三方数据流 我需要处理对给定 URL 的 POST 请求 该 URL 在其请求正文中具有预期可记录格式的 JSON 我不
  • 如何在 JavaScript 中从多维数组中删除空数组?

    我在从 Google Sheets 中的搜索应用程序的多维数组中删除空数组 对象时遇到问题 我在用getLastRow所以我以为我会避免这个问题 但不幸的是事实并非如此 我的数组如下所示 1 39080000912E11 RSSMA0040
  • 通过 std::bind 传递右值

    我想传递一个右值std bind到 C 0x 中采用右值引用的函数 我不知道该怎么做 例如 include
  • Java、传值、引用变量

    我在理解以下示例中 Java 的 按值传递 操作时遇到问题 public class Numbers static int s ccc 7 static int t ccc 7 public static void calculate in
  • Intel 在哪里记录了 ModR/M 字节中扩展寄存器 (R8-R15) 的编码?

    我用的是官方最新的 英特尔 64 和 IA 32 架构软件开发人员手册合并卷 1 2A 2B 2C 2D 3A 3B 3C 3D 和 4 作为了解x86 64 ISA的机器级编码的参考 第 2 卷第 2 1 3 节中提供的 ModR M 和
  • 从修订历史记录中删除特定文件

    我试图从修订历史记录中删除我无意提交的特定文件 有人可以提供一种方法来做到这一点吗 你需要使用svndumpfilter工具 该过程涉及转储您的存储库 过滤 使用svndumpfilter 你的转储文件 并将结果重新加载到新的存储库中 看本
  • 在哪里可以阅读访客信息

    UPDATE 这个问题暴露了过时的 最糟糕的方法visitors count每个人都应该避免这种情况 使用复杂的计数器 由于我没有找到令人满意的 足够简单 的解决方案 因此我想出了自己的解决方案 创建一个名为的空文件ip txt并在代码中的
  • 用python中的列表替换元素

    在Python中 用另一个列表中的元素替换列表中的元素的最佳方法是什么 例如 我有 a 1 replace this 4 我想更换replace this with 2 3 更换后必须是 a 1 2 3 4 Update 当然 可以用切片来
  • 如何复制 Azure 容器和 Blob

    我正在尝试将所有 blob 复制到不同的存储中 CloudBlobClient srcblobClient sourceStorageAccount CreateCloudBlobClient CloudBlobClient targetB
  • MapFragment:使用后退按钮后性能不佳

    我在使用时遇到性能问题MapFragment与操作栏菜单一起 当满足三个条件时就会出现该错误 Have a MapFragment实例化 从选项菜单触发片段事务 用另一个片段替换地图片段 点击后退按钮并返回到地图片段 现在性能明显下降 平移
  • 使用 ShapedDrawable 将 ColorFilter 应用于 ImageView

    我有一个ImageView with android src设置为ShapedDrawable 即一个白色圆圈 我想要的是给这个上色ImageView在运行时响应一些事件 imgView setColorFilter似乎是解决方案 但使用此
  • 使用 IP 地址从 C# HttpClient 向同一台机器发出 HTTP 请求

    基本上 我需要能够在我所在的同一台计算机上向网站发出 HTTP 请求 而无需修改主机文件来创建指向域名的指针 例如 我在一个网站上运行代码 假设 www bobsoft com 位于服务器上 我需要向位于同一服务器上的 www tedsof
  • 如何在 Sqlite 中将图像存储为 blob 以及如何检索它?

    我想将图像 来自 url 存储到 sqlite 数据库中 为此 我使用 db new DataBase getApplicationContext URL url new URL http sree cc wp content upload
  • 汇编程序不打印读取的字符串

    我编写了以下代码 允许用户输入一个数字并将其打印回来 model tiny stack 100 data userMsg db 13 10 Please enter a number dispMsg db 13 10 You have en
  • 在 Reveal.js 演示文稿末尾重复标题幻灯片

    我想在我的四开本 Reveal js 演示文稿末尾重复我的标题幻灯片 我正在寻找类似的命令title slide或其他东西 Thanks 正如我在评论中已经提到的 您可以使用一些 javascript 代码和 CSS 在演示文稿末尾自动重复
  • Node.js、WebSocket 位置问题?

    我使用 Node 监听 localhost 端口 8000 创建了一个服务器 已验证其运行正常 但我无法访问客户端上的 WebSocket Chrome 5 尝试了各种 Git 存储库 节点 websocket socketIO 文章等的几
  • 在 Go 中解组 XML 元素的异构列表

    我有一个像这样的 XML 文档