【发布时间】: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