我们如何修改现有的YAML并在其中保留注释。 是否有任何Java解析器可以做到这一点? 例如,如果我有以下YAML:
#This is a test YAML
name: abcd
age: 23
#Test YAML ends here.
有没有办法可以使用java解析器编辑这个Yaml并保留注释。
答案 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