为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的通用 XML 解析器

Go 中的通用 XML 解析器

Go
GCT1015 2021-12-07 10:56:52
在 Go 中是否有一些通用的读取 XML 文档的方法?类似于 C# 中的 XmlDocument 或 XDocument 的东西?我找到的所有示例都展示了如何使用解组功能将数据读取到我需要定义的对象中,但是这非常耗时,因为我需要定义很多我不会使用的人员。xml.Unmarshal(...)另一种方法是使用以下方法仅向前阅读:xml.NewDecoder(xmlFile)此处描述:http : //blog.davidsingleton.org/parsing-huge-xml-files-with-go/
查看完整描述

2 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我找到的所有示例都展示了如何使用解组功能将数据读取到我需要定义的对象中,但是这非常耗时,因为我需要定义很多我不会使用的人员。


然后不要定义你不会使用的东西,只定义你将使用的东西。您不必创建完全覆盖 XML 结构的 Go 模型。


假设您有一个这样的 XML:


<blog id="1234">

    <meta keywords="xml,parsing,partial" />

    <name>Partial XML parsing</name>

    <url>http://somehost.com/xml-blog</url>

    <entries count="2">

        <entry time="2016-01-19 08:40:00">

            <author>Bob</author>

            <content>First entry</content>

        </entry>

        <entry time="2016-01-19 08:30:00">

            <author>Alice</author>

            <content>Second entry</content>

        </entry>

    </entries>

</blog>

假设您只需要此 XML 中的以下信息:


ID

关键词

博客名称

作者姓名

您可以使用以下结构对这些需要的信息进行建模:


type Data struct {

    Id   string `xml:"id,attr"`

    Meta struct {

        Keywords string `xml:"keywords,attr"`

    } `xml:"meta"`

    Name    string   `xml:"name"`

    Authors []string `xml:"entries>entry>author"`

}

现在您可以使用以下代码仅解析这些信息:


d := Data{}

if err := xml.Unmarshal([]byte(s), &d); err != nil {

    panic(err)

}

fmt.Printf("%+v", d)

输出(在Go Playground上试试):


{Id:1234 Meta:{Keywords:xml,parsing,partial} Name:Partial XML parsing Authors:[Bob Alice]}



查看完整回答
反对 回复 2021-12-07
?
九州编程

TA贡献1785条经验 获得超4个赞

嗯,两件事。

首先,您不必定义映射到复杂元素的Go 类型来解析 XML,只需要encoding/xml. 相反,您可以纯粹以程序方式解析 XML 文档,并且xml.Unmarshal()仅调用原始(非嵌套)元素——将它们解析为“原始”类型(例如stringorint32time.Timeetc)的值。

这肯定会是很多代码,但这只是从更动态的角度来解决同样的问题。要理解我的意思,请考虑完全解析的 DOM 对象形式的 XML 文档。要从中提取有用的数据,您必须以某种方式查询该对象或遍历树。使用您提到的博客文章中介绍的方法,您在解析 XML 文档时遍历它 — 基本上将解析与查询/遍历结合起来。

这可能对您有用,也可能不起作用,因为解析 XML 格式数据的特定方法的适用性在很大程度上取决于其结构和解析的预期结果。例如,如果您需要对文档执行多个查询,而后面的查询取决于前者,则该博客文章中的程序解码几乎不起作用。

其次,存在替代库。例如,查看xmltreexmlpath。虽然这两个都写在纯围棋,存在几个包包装的libxml,例如,goxml。有了它们,您可以根据需要进行面向 DOM 的解析。

另一种方法是使用 .xml 将 XML 解析为一组嵌套的键/值映射mxj


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信