json - 使用 to 将大型 XML 文件转换为 JSON 以存储在 MongoDB 中
问题描述
对于我的一个项目,我必须处理超过 2GB 的 XML 文件。我想存储数据 mongoDB。我决定尝试使用 Go 语言。但是我在找出在 Go 中执行此操作的最佳方法时遇到了一些麻烦。
我见过很多具有固定 XML 结构的示例,但我得到的数据结构是动态的,所以使用某种预定义的结构对我来说是行不通的。
现在我偶然发现了这个包:https ://github.com/basgys/goxml2json看起来很有希望,但有一些我没有得到:
- 自述文件中给出的示例使用的是 XML 字符串,但我在接受文件的代码中看不到任何内容。
- 举个例子,我有 2GB 的 xml 文件,我不能简单地将整个 XML 文件加载到内存中。这会弄乱我的服务器。
我认为说得好,我只需要将 XML 数据转换一次即可转换为 JSON 格式,这样我就可以将其存储在 mongoDB 中。
你们中的一些人对如何使用 Go 将 XML 文件有效地解析为 JSON 有一些想法吗?
解决方案
一个典型的使用模式是读取标记,直到您找到感兴趣的东西,然后将标记解组为 XML 标记结构,然后相应地处理该数据。这样,您只需将单个 XML 令牌所需的内容加载到内存中,或者解组一些有趣的数据。
例如(去游乐场):
d := xml.NewDecoder(xmlStream)
for {
// Decode the next token from the stream...
token, err := d.Token()
if err == io.EOF {
break
}
check(err)
// Switch behavior based on the token type.
switch el := token.(type) {
case xml.StartElement:
// Handle "person" start elements by unmarshaling from XML...
if el.Name.Local == "person" {
var p Person
err := d.DecodeElement(&p, &el)
check(err)
// ...then marshal to JSON...
jsonbytes, err := json.Marshal(p)
check(err)
// ...then take other action (e.g. insert into database).
fmt.Printf("OK: %s\n", string(jsonbytes))
// OK: {"Id":"123","Name":"Alice","Age":30}
}
}
}
推荐阅读
- doxygen - 如何在 doxygen 中记录外部文件?
- python - 使用 changelist_view 在 django admin 中重定向
- javascript - 将捕获的图像保存到 react-native 中的自定义秘密相册
- c# - 项目启动时的 System.InvalidOperationException
- laravel - laravel JSON 验证规则
- git - 是否有任何 git 目录可以在默认情况下绝对且始终被忽略?
- python-3.x - Python:将列表中的子元素打印到 CSV
- npm - 带有 Webpack 的 MapboxGL:“ReferenceError: e is not defined”(在 vue-cli 应用程序中)
- python - 通过 Python 读取 txt 文件时的编解码器问题
- r - 按组减去每列的最小值 - 将减去的值添加到 df 中的另一列