我正在寻求实现类似于以下的扩展方法:
public static bool RemoveNode(this YamlDocument doc, YamlNode node)
{
}
基本上,我有一个YamlDocument
和一个YamlNode
我想从该文档中删除。 YamlDocument
或YamlNode
似乎都没有任何类型的Remove
方法。从source code来看,看起来子节点(至少对于Mapping Nodes)存储在children
字典中,可以通过Children
属性进行访问。我可能还需要解决此问题才能删除序列节点和标量节点。如果有人解决了这个问题,我很想听听您的方法。
此外,我遇到了另一个名为SharpYaml的库(似乎是YamlDotNet的一个分支),该库具有内置的删除节点的方法。但是,目前,退出Yaml库会有些高成本。所以,这是不得已的方法。
答案 0 :(得分:1)
问题是:删除YamlNode的语义是什么?简单的例子:
one:
two: three
four:
- five
- six
- seven
假设我在包含three
和six
的节点上调用一些 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>