验证和修改 XML:架构或代码?

Validate and revise XML: schema or code?

我有一个脚本使用相当广泛的基于 XML 的数据存储,目前我没有对 XML 进行真正的验证,自 XML 以来这已成为一个问题目前也是人工编辑的。 在短期内,我想验证 XML 不仅是有效的 XML,而且是对我而言有效的数据。最后我还想修改 XML,例如将数据从属性移动到节点。在我想要允许两者之间,当我加载 XML 时,我可以寻找一个也可以是属性的节点,并在需要时将属性分配给新创建的节点(在内存中)。 从概念上讲,至少对于验证而言,模式显然是正确的答案。但是,似乎模式不能支持其他需求,临时将属性映射到节点,最终实际更改 XML,创建节点,从属性分配值,删除属性,并保存回XML 文件。 我的想法是我应该创建一个 XML 文件来映射所有这些。它将从定义什么是 "valid" XML 开始,我现在可以在代码中使用来验证我的其他 XML。然后我可以扩展它以将属性也映射到新节点并使用它在摄取时创建这些节点,因此我的工作代码可以使用基于 XML 的节点,而文件 XML 仍然是属性。然后我又可以添加代码来修改 XML 文件。 所有这些工作量很大,所以我在这里要求确保这个过程从长远来看确实有意义。如果 PowerShell 或 XML Schemas 已经提供了一种很好的方法来执行此操作而无需所有额外代码,我将不愿自己动手。

而且,假设我自己动手是答案,我对一个实现细节很好奇。目前我加载 XML,然后在使用时,即各种 "task" 函数,我将 XML 读入变量,然后修改和使用(扩展标记以创建最终文件路径, ETC)。或者我可以直接在内存中修改 XML 本身,我很好奇是否有性能原因使用一种方法而不是另一种方法?额外的变量意味着额外的内存使用,但它们都是函数变量,所以它们最终会被垃圾收集。总数 XML 最多可以达到几 Kbs,所以我的感觉是性能不是要关注的问题,编码的难易程度才是,但是因为我没有找到描述 PowerShell 性能的真正好方法我只是猜测。

您用来描述您的计划的大量文字包含大量不必要的工作和重新发明。

专家和新手都已经通过使用正确的工具解决了此类问题:

  • Validation:使用标准 XML 模式语言,例如 XSD、RelaxNG 或 Schematron 来表达您的词汇和语法 XML。使用现成的验证解析器来检查您的 XML 遵守架构。不要指望任何转变 这里的能力,只是回答是否 XML 遵守指示位置的架构和诊断消息 当它没有时。
  • 转换:使用 XSLT 将 XML 从旧模式映射到新模式或更新的 XML 模式。第二选择:使用具有 solid XML 的过程语言 解析和最好的 XPath 支持。 PowerShell 符合条件。

最后,忘掉性能吧。您必须非常努力地使用标准工具才能解决 "a few Kbs" of XML 数据的性能问题。关注 expressiveness/clarity 的代码和程序员的生产力;使用既定的工具和标准将大有帮助。