我应该如何管理基于 Xml 的文档的不同不兼容格式

2024-01-22

我有一个应用程序,它以基于 Xml 的格式保存文档(例如 Word 文档) - 目前,从 xsd 文件生成的 C# 类用于读取/写入文档格式,一切都很好,直到最近我不得不更改以下格式:该文件。我担心的是我的应用程序的未来版本的向后兼容性need能够读取所有以前版本保存的文档,理想情况下,我还希望我的应用程序的旧版本能够优雅地处理读取我的应用程序的未来版本保存的文档。

例如,假设我更改文档的架构以在某处添加(可选)额外元素,那么我的应用程序的旧版本将简单地忽略额外元素,并且不会出现问题:

<doc>
    <!-- Existing document -->
    <myElement>Hello World!</myElement>
</doc>

但是,如果进行了重大更改(例如,将属性更改为元素或元素集合),那么我的应用程序的过去版本应该忽略此元素(如果它是可选的),或者通知用户他们正在尝试否则,请阅读使用我的应用程序的新版本保存的文档。此外,这目前也让我头疼,因为我的应用程序的所有未来版本都需要完全独立的代码来读取两个不同的文档。

以下 xml 就是此类更改的一个示例:

<doc>
    <!-- Existing document -->
    <someElement contents="12" />
</doc>

更改为:

<doc>
    <!-- Existing document -->
    <someElement>
        <contents>12</contents>
        <contents>13</contents>
    </someElement>
</doc>

为了防止将来出现支持问题,我想提出一个不错的策略来处理将来可能做出的更改,以便我现在发布的应用程序版本能够应对这些更改未来:

  • 文档的“版本号”是否应该存储在文档本身中?如果是,应该使用什么版本控制策略?如果文档版本与 .exe 程序集版本匹配,或者应该使用更复杂的策略(例如,主要修订版更改表示重大更改,而次要修订版增量表示非重大更改 - 例如额外的可选元素)
  • What method should I use to read the document itself and how do I avoid replicating massive amounts of code for different versions of documents?
    • 虽然 XPath 显然是最灵活的,但它比简单地使用 xsd 生成类要实现更多的工作。
    • 另一方面,如果使用 DOM 解析,则每个重大更改都需要在源代码管理中生成文档 xsd 的新副本,如果需要将修复应用于旧模式(仍支持旧版本的应用程序),则会导致问题。

另外,我非常松散地假设我所做的所有更改都可以分为“喙状更改”和“非破坏性更改”这两类,但我并不完全相信这是一个安全的假设使.

请注意,我非常宽松地使用“文档”一词 - 内容根本不像文档!

感谢您能给我提供的任何建议。


您肯定需要 XML 文件中的版本号,我建议不要将其与应用程序的版本绑定,因为它实际上是一个单独的实体。您可能会使用应用程序的两个或三个版本而无需更改 XML 格式,或者您可能会在单个版本的开发过程中多次更改格式。

如果您希望旧版本的应用程序能够读取新版本的 XML 文件,那么您永远不能删除元素或更改它们的名称。您始终可以添加元素,旧代码会很乐意忽略它们(XML 的优秀功能之一),但如果删除它们,则旧代码将无法运行。

正如 Ishmael 所说,XSLT 是将 XML 格式从一个版本转换为另一个版本的好方法,这样您就不会在源代码中遇到一大堆解析例程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何管理基于 Xml 的文档的不同不兼容格式 的相关文章

  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • OL3:按坐标从图层获取特征

    我想通过坐标获取图层的特征 此外 我想在弹出窗口中打开此功能 到目前为止我已经通过 onclick 事件解决了这个问题 但我想通过给出特征的坐标并打开特征的弹出窗口来实现 我有一个带有地图的图层和一个带有以下功能的图层 if trackMa
  • 为什么案例类的“unapply”方法的实现中有一个“null”检查?

    我正在努力更换unapply案例类的伴随对象上的方法与我自己的实现 在调查了许多与实施相关的不同切线之后unapply 看来有一个null其中大多数都受到保护 无论是在编译器生成的代码中还是在显式重新定义的实现中 编译器生成的代码为unap
  • 使用 ArrayController 中的 Binding 对 NSScrollView、NSTableView 的内容进行排序

    我有一个NSScrollView这与一个绑定ArrayController 我需要按字母顺序对内容进行排序 我尝试使用绑定来做到这一点 但找不到合适的绑定 我用了以下sortDescriptor on my ArrayController
  • 如何将 NodeJS 和 node_modules 添加到 Mac 应用程序

    我正在编写一个 Mac 应用程序 当前依赖于节点二进制文件的存在 这种方法的主要不便在于 由于 App Store 的限制 用户需要授予对节点二进制文件以及全局 node modules 文件夹的访问权限 所以我的想法是将节点二进制文件以及
  • 如何使 pytest 因警告而崩溃?

    这是一个扩展如何找到 因非串联而排序 警告的来源 https stackoverflow com questions 54486927 how do i find where a sorting because non concatenat
  • 数据包已发送但无法接收到数据包

    我一直在编辑安卓toyvpn https android googlesource com platform development master samples ToyVpnVPN 的示例项目 我为我的示例应用程序找到了这个 我知道我的代
  • PHP 变量大小有限制吗?

    我需要知道 PHP 是否有可变的限制大小 我从 SQL 数据库中获取一个字符串字段并使用echo在网页上查看它 我遇到的问题是 当我查看网页时 我看不到数据库字段中的所有内容 PHP 变量的大小有限制吗 有没有办法让 PHP 从数据库中读取
  • 如何使用 Ninject 将服务注入授权过滤器?

    我正在使用 asp net mvc 3 ninject 2 0 和 ninject mvc 3 插件 我想知道如何将服务层放入我的过滤器中 在本例中是授权过滤器 我喜欢进行构造函数注入 所以这是可能的还是我必须进行属性注入 Thanks E
  • 当 cfn 模板和管道都是使用 AWS CDK 创建时,如何使用 CodePipeline 部署 CloudFormation 堆栈?

    我使用 AWS CDK 创建了一个带有自动扩展组的简单堆栈 并定义了启动配置资源以在 ec2 实例创建期间执行一些 powershell 脚本 这些脚本位于同一个 cdk typescript 项目中 我使用 aws s3 asset 构造
  • UICollectionView 最后一个单元格未对齐

    我是 iOS 新手 现在遇到一个问题 我的目标是获得一个带有过滤按钮的滑动条 我有一个 UICollectionView 作为其他视图中的子视图 除了最后一个单元格之外 所有视图都显示良好 这是 uicollectionview 的委托和日
  • 当我在平面上嵌入平面图时,如何找到包含预定义点的面

    我有一个嵌入在平面上的平面图 平面图 并且想要搜索它的面 该图不是连接的 而是由多个连接的图组成 这些图不能单独寻址 例如 子图可以包含在另一个图的表面中 我想找到包含某个二维点的多边形 面 多边形由图形的面形成 由于面孔数量相当大 我想避
  • 如何杀死扭曲的协议实例python

    我有一个使用 Twisted 用 python 编写的服务器应用程序 我想知道如何终止我的协议 bottalk 的实例 每次我获得新的客户端连接时 我都会在内存中看到该实例 print Factory clients 但是假设我想从服务器端
  • 如何将sql参数作为整数数据类型变量中的空值传递?

    如何将 sql 参数作为空值传递给整数数据类型变量 StockBO sBO new StockBO sBO Mode 2 if ddcmpanyname SelectedIndex 0 sBO Client id Convert ToInt
  • 如何检查引用的程序集在运行时是否可用?

    我正在创建一个简单的 独立的 net winforms 应用程序 它引用了程序集Microsoft SqlServer SqlWmiManagement Net Framework 4 的版本可能存在或不存在于客户端计算机上 如果该程序集不
  • 如何使用 es6 import 加载 emscripten 生成的模块?

    我正在尝试导入使用 emscripten 生成的模块作为 es6 模块 我正在尝试与基本示例 https kripken github io emscripten site docs porting connecting cpp and j
  • 跨多列排序 (Perl)

    对于以下代码 我将如何对多个列进行排序 目前 代码 1 得到一个 lista 中的文件数 directory2 使用正则表达式获取 fileName fileLocation and fileSize对于中的每个元素 list3 将 2 中
  • 数据注释验证属性中的 string.Format

    有没有办法使用格式化字符串而不是直接常量来设置数据注释消息 我需要像下面的代码一样设置必填字段 ErrorMessage 但它给了我一个错误 Required ErrorMessage string Format SystemMessage
  • Hyperledger Composer 点对点连接未建立

    我们使用 Hyperledger Composer 建立了一个业务网络 并通过创建对等点来创建参与者卡 当我们在导入参与者卡后尝试将对等方连接到本地的另一台计算机时 我收到以下错误 错误 尝试登录并获取用户上下文时出错 错误 尝试时出错 注
  • 运行 GO111MODULE=on go install 。 ./cmd/... 在云初始化中

    我有一个使用 cloud init 部署的 bash 脚本 我的 bash 脚本包含以下部分代码 GO111MODULE on go install cmd 当直接在已部署服务器的终端中运行我的 bash 脚本时 它按预期工作 但是当我在云
  • 我应该如何管理基于 Xml 的文档的不同不兼容格式

    我有一个应用程序 它以基于 Xml 的格式保存文档 例如 Word 文档 目前 从 xsd 文件生成的 C 类用于读取 写入文档格式 一切都很好 直到最近我不得不更改以下格式 该文件 我担心的是我的应用程序的未来版本的向后兼容性need能够