【问题标题】:Is it possible to remove a YamlNode from a YamlDocument是否可以从 YamlDocument 中删除 YamlNode
【发布时间】:2020-01-02 22:05:58
【问题描述】:

我正在寻求实现类似这样的扩展方法:

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

}

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

另外,我遇​​到了另一个名为 SharpYaml 的库(它似乎是 YamlDotNet 的一个分支),它内置了删除节点的方法。但是,目前切换 Yaml 库的成本会有些高。所以,这是最后的手段。

【问题讨论】:

    标签: c# .net yaml yamldotnet


    【解决方案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 时,根据您回答上述问题的方式执行适当的操作。

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 2017-08-19
      • 1970-01-01
      • 2016-06-03
      • 2017-10-13
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多