0

这不是一个特定的编程问题,而是要求知道做某事的正确方法。

“The Something”:我的代码执行用户提供的将 XML 作为标准输出的 powershell 脚本。该输出应该遵循我们作为软件设置例程的一部分发布和交付的模式。我们支持输出中的版本,因此客户的 XML 将在其 XML 的根目录中针对版本 2 输出具有类似的内容:

<my_report version="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mycompany.com/permanent/config-2.0.xsd config-2.0.xsd">

客户输出的 XML 可能不是有效的 XML(因此在我们使用它之前需要进行验证)。

我的目标是获取版本属性的值并确保它与提供的正确 .xsd 文件名匹配,然后使用该 .xsd 文件来验证输出 XML。

由于输出 XML 可能无效,因此我不能依赖 XElement.Parse() 之类的东西将 XML 放入变量中以对其进行操作。所以,我觉得我唯一的办法是解析第一个元素(my_report)并使用字符串操作来进行确定。

注意:运行代码的机器不保证可以访问互联网。

我的基本问题:这是理智的想法吗?我是否愿意做这样的事情?如果思维不健全,有什么好的选择?

平台是 Windows Server 2008 R2,C# 4.0 控制台应用程序类型。

4

1 回答 1

0

通常,对于 Xml 文档的版本控制,您使用命名空间。在这种方法中,每个版本都有自己的命名空间和自己的 Xsd。要验证 Xml 文档,您需要将所有 Xsd 文档加载到一个模式集并验证 xml。这远非理想(增加了很多复杂性,即使文档只是不同的版本,它们在语义上是完全不相关的,而通常是在以前版本之上构建的新版本等),但我认为这仍然是最常见的事情。如果您只是对已经使用没有命名空间的 xml 文档进行版本控制的现有系统进行改造验证,那么使用上述方法将意味着您的应用程序中会有很多变化(更不用说发送 xml 文件的客户所做的更改)。要发现版本,您可以首先使用 XmlReader - 您将移动到根元素并检查名称是否符合您的预期以及版本属性(或者只是版本,因为您的架构应该拒绝具有意外根元素的文档)。然后,您将抛出您创建的 XmlReader 实例并创建一个新实例以进行验证(并可能加载文档)。这应该很便宜,因为您实际上并没有阅读整个文档来发现版本,而只是发现了根元素,并且如果文档不是有效的 Xml 文档(例如没有根节点等),XmlReader 将检测到并且扔。然后,您将抛出您创建的 XmlReader 实例并创建一个新实例以进行验证(并可能加载文档)。这应该很便宜,因为您实际上并没有阅读整个文档来发现版本,而只是发现了根元素,并且如果文档不是有效的 Xml 文档(例如没有根节点等),XmlReader 将检测到并且扔。然后,您将抛出您创建的 XmlReader 实例并创建一个新实例以进行验证(并可能加载文档)。这应该很便宜,因为您实际上并没有阅读整个文档来发现版本,而只是发现了根元素,并且如果文档不是有效的 Xml 文档(例如没有根节点等),XmlReader 将检测到并且扔。

于 2012-09-20T04:08:09.363 回答