是否可以从YamlDocument中删除YamlNode

时间:2020-01-02 22:05:58

标签: c# .net yaml yamldotnet

我正在寻求实现类似于以下的扩展方法:

public static bool RemoveNode(this YamlDocument doc, YamlNode node)
{

}

基本上,我有一个YamlDocument和一个YamlNode我想从该文档中删除。 YamlDocumentYamlNode似乎都没有任何类型的Remove方法。从source code来看,看起来子节点(至少对于Mapping Nodes)存储在children字典中,可以通过Children属性进行访问。我可能还需要解决此问题才能删除序列节点和标量节点。如果有人解决了这个问题,我很想听听您的方法。

此外,我遇到了另一个名为SharpYaml的库(似乎是YamlDotNet的一个分支),该库具有内置的删除节点的方法。但是,目前,退出Yaml库会有些高成本。所以,这是不得已的方法。

1 个答案:

答案 0 :(得分:1)

问题是:删除YamlNode的语义是什么?简单的例子:

one:
  two: three
four:
  - five
  - six
  - seven

假设我在包含threesix的节点上调用一些 remove 方法。结果是:

one: {}
four:
  - five
  - seven

或更确切地说:

one:
  two: !!null ~
four:
  - five
  - !!null ~
  - seven

使用第一个选项,还从文档中删除节点two并更改seven的索引。使用第二个选项,可以将节点替换为空节点,而不是删除它们。哪个是对的?对于two:如果您最终希望将该YAML映射加载到具有字段two的类对象中,则可能要保留two并将其替换为null。但是,如果要将其加载到字典中,则可能还希望删除键two。我们将看到:删除方式的详细信息取决于图形的语义,由于YamlDotNet对此一无所知,因此无法为您决定。

这是另一个有趣的情况:

foo: &a
  bar: *a

使用&a锚删除内部映射值时会发生什么?在YamlDocument中,这是一个YamlNode,将从两个地方引用。可能是您实际上只想删除别名*a生成的引用吗?或者,如果要删除外部引用,是否希望YamlNode对象在从文档中删除后仍保留对自身的引用?


假设您对这些问题有答案,那么遍历图似乎并不难实现。保留HashSet个访问的节点以中断周期,因为每个序列和映射都属于其子节点,并且每次找到应删除的YamlNode时,请根据您对上述问题的回答方式执行适当的操作。 / p>