用于将大型XML文件转换为JSON以存储在MongoDB中

时间:2018-10-08 19:40:53

标签: json xml mongodb parsing go

对于我的一个项目,我必须处理2GB以上的XML文件。我想存储数据mongoDB。我决定尝试使用Go语言。但是我很难在Go中找出最好的方法。

我已经看到了很多具有固定XML结构的示例,但是我得到的数据结构是动态的,因此使用某种预定义的结构对我不起作用。

现在,我偶然发现了这个软件包:https://github.com/basgys/goxml2json,它看起来非常有前途,但是有些事情我没有得到:

  • 自述文件中提供的示例使用的是XML字符串,但是我在接受文件的代码中看不到任何东西。
  • 给出示例,我有2GB的xml文件,我不能简单地将整个XML文件加载到内存中。这会使我的服务器混乱。

我认为这是一个很好的说法,我只需要将XML数据转换一次为其JSON格式,就可以将其存储在mongoDB中。

你们中的一些人对如何使用Go将XML文件有效地解析为JSON有想法吗?

1 个答案:

答案 0 :(得分:0)

Go提供了一个builtin XML stream parser at encoding/xml.Decoder

一种典型的用法模式是读取令牌,直到找到感兴趣的内容,然后将令牌解组为XML标记的结构,然后相应地处理该数据。这样,您只需将单个XML令牌所需的内容加载到内存中,即可解组一些有趣的数据。

例如(Go Playground):

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}
    }
  }
}