在保留注释的同时在java中修改YAML

时间:2018-04-13 07:57:47

标签: java yaml snakeyaml

我们如何修改现有的YAML并在其中保留注释。 是否有任何Java解析器可以做到这一点?  例如,如果我有以下YAML:

#This is a test YAML
 name: abcd
 age: 23
#Test YAML ends here.

有没有办法可以使用java解析器编辑这个Yaml并保留注释。

3 个答案:

答案 0 :(得分:2)

截至撰写本文时,没有针对Java的往返YAML解析器。有一个众所周知的SnakeYAML,它不会保留评论(请参阅author's comment here),还有一个名为camel的新项目,我对此知之甚少;但它肯定不是迂回曲折。

理论上你可以做的是使用SnakeYaml的Yaml.parse,然后迭代事件。每个事件都有一个开始和结束标记,给出开始和结束线&活动的一栏。这使得可以将事件映射回源并发现未被解析为事件的源部分(可能是注释)。有了这个映射,您现在可以修改事件列表并将其写回。最后,您第二次阅读结果并发现原始YAML中有注释但未在修改后的YAML中发生事件的事件之间的差距,并重新插入这些注释,为您提供修改后的最终YAML 评论。

当然,这非常复杂。我不建议这样做,除非你a)对YAML的结构或者愿意学习它有充分的理解,以及b)你的用例证明了这一点工作的合理性。

答案 1 :(得分:1)

我写了一个时髦的脚本来解决这个问题。 Java版本非常相似:

def key = "name"
def value = "efgh"
def yamlFile = new File("file.yaml")
def yamlFileLines = new StringBuilder()
def foundKey = false
yamlFile.text.eachLine { line ->
    if (!foundKey && line.contains("$key:")) {
        line = line.replaceAll(/$key:.*/, "$key: $value")
        foundKey = true
    }
    yamlFileLines.append("$line\n")
}
if (foundKey) {
    yamlFile.text = yamlFileLines.toString()
} else {
    throw new StopExecutionException("Could not find key '$key' in file ${yamlFile.getAbsolutePath()}")
}

答案 2 :(得分:0)

如果使用snakeyaml,则应修改ScannerImpl文件。

注意:以文字形式阅读在线注释

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim table As New DataTable
        table = New DataTable()
        table.Columns.Add("Av")
        table.Columns.Add("h")
        table.Rows.Add("test1", "1001")
        table.Rows.Add("test2", "1002")
        table.Rows.Add("test3", "1003")
        DataGridView1.DataSource = table
        DataGridView1.AllowUserToAddRows = False

    End Sub