【问题标题】:Wisely save and read changed configuration (stored in XML file)明智地保存和读取更改的配置(存储在 XML 文件中)
【发布时间】:2019-03-08 15:07:20
【问题描述】:

我正在处理一个将其配置(广义上)存储在 XML 文件中的系统。它还允许用户覆盖某些参数。现在,如果用户 whole 更改了配置,XML 文件将被重写(在用户目录中)并进行更改。但是很不方便。

假设我们有如下基本配置:

<configuration>
    <groupOfProperties>
        <someProperty>Sample value</someProperty>
        <otherProperty>Sample other value</otherProperty>
    </groupOfProperties>
</configuration>

它被用户覆盖,现在变成了这样:

<configuration>
    <groupOfProperties>
        <someProperty>Changed value</someProperty>
        <otherProperty>Sample other value</otherProperty>
    </groupOfProperties>
</configuration>

它很酷而且没有问题,除非我们的基本配置因某种原因而改变。例如 - 添加了一个新参数:

<configuration>
    <groupOfProperties>
        <someProperty>Sample value</someProperty>
        <otherProperty>Sample other value</otherProperty>
        <newProperty>Sample new value<newProperty>
    </groupOfProperties>
</configuration>

现在用户不知道该更改,并且某些 黑盒 读取 XML 文件不会获得在基础中更改的新属性。然而,我们可以放心地假设不读取其中一些是故障安全的,并且它只影响系统的功能层。

有什么方法可以智能保存更改的 XML(最好 - 只是更改的部分)并在处理请求时轻松地将其与基本文件“合并”以获得特定值?

我想我实际保存的不是 XML 文件,而是某种补丁 (https://www.rfc-editor.org/rfc/rfc5261)。然后在读取某些属性时,我基本上会读取基本文件并对其应用补丁以获得“真实”配置?

我不是在寻找一个非常精确的实现,而是寻找这个问题的通用解决方案以及如何解决它的一些概念。

非常感谢您的回答!

附:在实际系统中,XML 文件比给定的示例要复杂得多。

P.S.2 不幸的是,XML 文件(或任何其他平面文件)是系统的唯一途径。我们可以称之为技术债务。

【问题讨论】:

  • 我首先想到的是 XSLT,果然为类似问题找到了类似的答案! stackoverflow.com/questions/15175287/how-to-merge-two-xml-files。我相信这会解决您的问题?我有点不清楚您的保存是如何工作的……您是否可以在要保存的位置访问主文件和用户文件?无论您希望将 new 文件与 master 文件进行比较并只更新不同的字段,并且 XSLT 实现是一种优雅的解决方案,我认为 XSLT 是一个优雅的解决方案。
  • 在提到的系统配置中,通常是一个对话框(UI 元素)定义和与用户与对话框交互相关的逻辑。我们提供了一些简单的编辑器,可用于修改其设计和行为。一旦用户决定进行更改,它就会以更改的形式保存,一旦我们识别出用户上下文,我们就会显示更改的对话框(为了简化 - 更改的 XML 文件),而不是主对话框。然而,在任何时候我们都可以访问主控。文件本身可能真的复杂且不规则,并且编写 XSLT 来转换它们中的每一个恐怕都是无法撤消的。

标签: xml xpath design-patterns


【解决方案1】:

将数据更改捕获为一系列补丁的通用解决方案称为Event Sourcing。它允许通过应用所有以前的补丁来计算当前数据状态,并且还允许审计任何以前的状态。这种模式的典型例子是版本控制系统。

【讨论】:

  • 非常感谢您的建议!我确实理解事件溯源的概念。然而,我确实相信我的问题不是跟踪事件、存储它们、提供撤销它们的可能性或使用它带来的任何其他好处。提到的 XML 文件在应用程序运行时是静态的。它们被更改一次(在应用程序运行时之外),之后无论如何都不会被修改。所以本质上我的问题是如何巧妙地捕捉和应用这种变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多