c++ - 读/写同一配置文件不同版本的设计方法

标签 c++ xml qt design-patterns user-interface

在我们的项目中,我们有一个使用外部配置文件(例如 server.xml)的应用程序。现在我们需要在 C++/QT 中设计一个设置工具 GUI 来读取/编辑这样的配置文件,它应该能够处理这样的文件的所有不同版本。用户将选择文件版本,然后继续编辑。从一个版本到另一个版本并没有太大变化,也许有一个新的 xml 标签,一个名称不同或位置不同的标签。

这样做的最佳设计方法是什么?我们计划采用标准的 MVC 设计模式,但如何处理所有不同的配置版本,而无需再次重写相同的 GUI 代码?

这里是示例配置文件:

<?xml version="1.0" encoding="utf-8"?>
<Server_configuration ver="11">
  <core>
    <enable-tms>true</enable-tms>
    <enable-gui-messages>true</enable-gui-messages>
    <waiting-for-config-timeout>10000</waiting-for-config-timeout>
    <remoting>
      <port>50000</port>
      <join-timeout>5000</join-timeout>
      <ismultithread>true</ismultithread>
      <maxconcurrentrequests>20</maxconcurrentrequests>
    </remoting>
  </core>
  <content>
    <ftp>
      <ip>192.168.0.227</ip>
      <port>21</port>
      <userid>******</userid>
      <passwd>******</passwd>
    </ftp>
    <library>
      <ip>192.168.0.227</ip>
      <port>50023</port>
    </library>
    <local>
      <asset-root>/assetroot</asset-root>
      <kdm-expiration-warning>172800000</kdm-expiration-warning>
    </local>
    <hula-store-daemon>
      <ip>127.0.0.1</ip>
      <port>5567</port>
    </hula-store-daemon>
  </content>
</Server_configuration>

最佳答案

这并不意味着解决方案的下降,但我这里有一些事情要做/考虑。每种情况都会有所不同。

  • 在你的配置文件中有一个明确的版本标识符。对它们进行指纹识别是一个真正的(容易出错的)痛苦。
  • 考虑使用一种可以在不同版本之间进行更新的工具。这比阅读旧版本并尝试应用它们要容易得多。
    • 我可能更容易单独执行每个版本步骤,但这可以使转换不那么“无损”。一个快乐的混合体是从一个版本到另一个版本进行小更新,但有“检查点”主要升级,可以直接跳到最新的(或最新的“检查点”)。这有点像 incremental backups每隔一段时间使用完整备份快照。
    • 让用户了解情况。如果您更改他的设置,系统管理员将不会高兴。您可能希望使过程具有交互性或将注释放入每个添加/移动/删除设置的文件中。我还建议在文件的某些部分保留已删除的设置以供用户引用。 (记下为什么它们也在那里)。
  • 备份旧文件。您的脚本会崩溃并且会吃掉数据。执行类似命名当前文件 ${oldname}.old-${ver}~ 的操作。将设置保存在文件的不同部分并不总是足够的,这将为您的用户省去很多心痛。

关于c++ - 读/写同一配置文件不同版本的设计方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13236294/

相关文章:

c++ - 在没有原始循环的情况下将数据添加到 STL 容器

python - PyQt:当单元格进入 QCalendarWidget 时发出信号

c++ - 连接客户端时如何在QT中更新QGraphicsView?

c++ - Qt-Signal 未在虚拟机中连接

c++ - 访问在 C++ 模板中声明的常量

c++ - OpenMP 性能影响 : private directive vs. 在构造中声明变量

c++ - 如何在 Linux C/C++ 程序中支持多语言?

xml - 如何使用 Scala 将 xml 文档解析为流?

java - 将新元素追加到现有 XML 中

java - 使用引用进行部分解码