这不是一个具体的编程问题,而是要求了解正确的做法。
“Something”:我的代码执行用户提供的powershell脚本,它们将XML作为stdout发出。此输出应该遵循我们作为软件设置例程的一部分发布和提供的模式。我们支持输出中的版本,因此客户的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)并使用字符串操作来做决定。
注意:代码操作的计算机无法保证能够访问Internet。
我的基本问题:这是理智思考吗?我是不是在杂草上做这样的事情?如果没有理智思考,什么是好的选择?
平台是Windows Server 2008 R2,C#4.0控制台应用程序类型。
答案 0 :(得分:0)
通常,对于版本控制Xml文档,您使用名称空间。在这种方法中,每个版本都有自己的命名空间和自己的Xsd。要验证Xml文档,您需要将所有Xsd文档加载到一个模式集并验证xml。它远非理想(增加了很多复杂性,即使文档只是不同版本,它们在语义上完全不相关,而通常是在以前版本之上构建的新版本等)但我认为它仍然是最常见的事情。如果您只是将现有系统的验证改造为已使用xml文档而没有使用上述方法进行版本控制的命名空间,则意味着您的应用程序会发生很多变化(更不用说发送xml文件的客户所做的更改)。要发现您可以首先使用XmlReader的版本 - 您将移动到根元素并检查名称是否符合您的预期和版本属性(或仅作为模式的版本应拒绝具有意外根元素的文档)。然后,您将抛出您创建的XmlReader实例并创建一个新的实例进行验证(并可能加载文档)。这应该是便宜的,因为你实际上没有读取整个文档来发现版本而只是根元素,如果文档不是有效的Xml文档(例如没有根节点等),XmlReader将检测到抛出。