Parsing 如何跳过YAML流中出现错误的文档?

Parsing 如何跳过YAML流中出现错误的文档?,parsing,yaml,pyyaml,Parsing,Yaml,Pyyaml,Python库pyyaml似乎不允许我读取多文档YAML流并继续通过解析错误点。我有两个相关的问题: 我只是缺少了一些东西,而其他一些API将支持这一点吗 其他编程语言中的解析器是否支持此操作?(若有,详情为何) 以下是多文档YAML流的示例: %YAML 1.1 --- #YAML可以包含这样的注释 姓名:大卫 年龄:55 --- 姓名:梅 年龄:50#包括行尾 --- 姓名:胡安娜:错误 年龄:47 ... --- 姓名:阿德巴约 年龄:58 ... 我希望类似于此的代码可以跳过坏文档,但

Python库
pyyaml
似乎不允许我读取多文档YAML流并继续通过解析错误点。我有两个相关的问题:

  • 我只是缺少了一些东西,而其他一些API将支持这一点吗
  • 其他编程语言中的解析器是否支持此操作?(若有,详情为何)
  • 以下是多文档YAML流的示例:

    %YAML 1.1
    ---
    #YAML可以包含这样的注释
    姓名:大卫
    年龄:55
    ---
    姓名:梅
    年龄:50#包括行尾
    ---
    姓名:胡安娜:错误
    年龄:47
    ...
    ---
    姓名:阿德巴约
    年龄:58
    ...
    
    我希望类似于此的代码可以跳过坏文档,但要弄清楚“无论此文档有多坏,在
    ..
    --
    之后都会有新的内容开始

    以open('data/multidoc bad.yaml')作为流的
    :
    docs=yaml.load\U all(流)
    尽管如此:
    尝试:
    文档=下一个(文档)
    打印(文档)
    除停止迭代外:
    打破
    除异常作为错误外:
    打印(错误)
    
    我想得到:

    {'name': 'David', 'age': 55}
    {'name': 'Mei', 'age': 50}
    mapping values are not allowed here
      in "data/multidoc-bad.yaml", line 10, column 12
    {'name': 'Adebayo', 'age': 58}
    
    但事实上,我没有得到“阿德巴约”的最后一句话

    我认识到我可以自己编写一个小型解析器,读取行,只查找
    ..
    --
    行来对流进行分块。然后在我自己的解析之后,只将单个文档传递给
    yaml.loads()
    。但这似乎确实是解析器应该为我做的事情

    我只是缺少了一些东西,而其他一些API将支持这一点吗

    不,皮亚姆不能这样做

    其他编程语言中的解析器是否支持此操作?(如果支持,请选择哪种)

    据我所知没有。大多数YAML解析器都是手工编写的,其中相当一部分是PyYAML的翻译。我不知道有哪一个能够实现错误恢复。(我曾与SnakeYAML、go YAML、PyYAML、Libyml、YamlDotNet合作,并编写了Nimyml和AdaYaml。)

    但这似乎确实是解析器应该为我做的事情

    我认为解析器不支持这一点的原因包括

    • 如果没有错误恢复,为YAML编写兼容解析器已经非常复杂
    • 多文档功能很少使用,因此在增强它方面投入的精力很少
    • 只有在这种情况下,才能明显地实现错误恢复;我认为在YAML文档中,几乎不可能实现有用的错误恢复,因此错误恢复不被视为一个明显的功能来实现
    • 解决方法非常简单(您自己描述的)