0%

使用libyaml

介绍

libyaml是用于解析和生成yaml文件的C语言库,是yaml官方推荐的C语言库之一。

读取

本文只关注于读取yaml文件,没有涉及生成和修改。

libyaml支持三种读取模式:

基于token

我个人觉得已经可以被基于event的模式取代

基于event

这是官方页面的实例代码介绍的模式,应用程序处理各种yaml定义的事件

  • STREAM-START
  • STREAM-END
  • DOCUMENT-START
  • DOCUMENT-END
  • ALIAS
  • SCALAR
  • SEQUENCE-START
  • SEQUENCE-END
  • MAPPING-START
  • MAPPING-END

来读取yaml文件内的元素

  • stream ::= STREAM-START document* STREAM-END
  • document ::= DOCUMENT-START node DOCUMENT-END
  • node ::= ALIAS | SCALAR | sequence | mapping
  • sequence ::= SEQUENCE-START node* SEQUENCE-END
  • mapping ::= MAPPING-START (node node)* MAPPING-END

这种方法需要自己实现一个状态机,根据事件来判断下一步处理的事件,同时读取元素。

基于document

使用这种模式,libyaml将整个yaml读入内存,应用程序不需要再处理上面两种模式里的事件或者token, 只需要按照libyaml在内存中的数据结构安排,将其遍历出来,比较方便,也类似于libxml的模式。

使用这种模式,我实现了读取kubeconfig yaml文件,代码在

kubeyaml