Visual Studio IDE中使用XSD进行XML验证

105

我知道我之前做过这件事,但今天它不起作用了,也找不到任何地方解释如何做。可能是我的睡眠不足,但我怀疑有小鬼捣乱。

我有一个XML文档和一个定义它的XSD文件目录。如何设置Visual IDE以通知我验证失败,并在给定上下文中提供有效标签和属性的智能提示列表?

我尝试了以下方法:

  • 我将XSD文件添加到与XML文档相同的项目中。
  • 我将XSD文件添加到XML模式列表中(在XML /模式...菜单项下)。
  • 我甚至在XML文档中包括schemaLocation和noNamespaceSchemaLocation属性。

Visual Studio仍然没有提供有用的调试或编辑信息。我尝试了2010年和2008年版本(我认为我之前在2008年版本中做过)。

更新:我让另一位开发人员尝试了一下,他也失败了。他知道他曾经对其他XML文档进行过操作并使其正常工作。然后我下载了Oxygen XML编辑器,使用同样的XML和XSD文件,它可以正常工作,所以这些文件似乎都没问题(或者Oxygen更加宽容/灵活……)。

5个回答

145

您需要将XML文档与您拥有的XSD文件在Visual Studio中关联起来。

  1. 您应该在XML文档的属性窗口中看到类似于以下内容:

    XML Properties > Schema

  2. 在XML模式集编辑器中(单击属性窗口中“模式”文本框中的(...)省略号时打开),您需要确保已经存在您的模式。此外,请确保该模式的Use列已启用 - 如果没有,请单击它 - 您将获得一个下拉列表选项,选择带有绿色勾号的Use选项:

    XML Schema Selector

  3. 确保Visual Studio的错误列表窗口可见(菜单View>Error List)。这将显示XML和XSD模式定义之间的所有不一致之处。

  4. 一旦所有内容都准备好了,Visual Studio XML编辑器应该会使用蓝色波浪线在编辑器中突出显示XML的问题:

    Example of Error


尽管你的答案对我没有起作用,但我已经接受了它。我猜测我的系统可能出了问题,但我已经换了一台新电脑,现在一切都正常了。 - Jim McKeeth
42
@jim 不确定你有没有遇到同样的问题,但在我意识到 XML 文件必须在编辑器中打开且在调出“属性”窗口时焦点必须在编辑器中时,我浪费了很长时间。只有这样,您才能获得“XML 文档”属性,从而可以分配模式。如果焦点在“解决方案资源管理器”中,则“属性”窗口仅显示文件属性,即无法在此处分配模式。 - herzbube
@marc_s 它运行得很好。我正在寻找Visual Studio中的XML验证。但是,如果我打开一个XML文件并且路径(文件夹)中没有XSD文件,则Visual Studio将无法检测到XSD。是否有任何选项可以使Visual Studio发出像“未找到XSD文件”这样的消息? - IT researcher
@ITresearcher Visual Studio没有检测安装目录中缺失XSD文件的能力,因为一旦所有XSD文件被加载,它就不知道缺少哪些XSD文件。相反,它假定在%installroot%/xml/schema中加载了所有的XSD文件。这是你必须在Visual Studio之外手动添加/删除/替换/修复/修改等操作的事情。 - tom_mai78101
2
我认为你应该在答案本身中添加@herzbube的发现。 - ashish
显示剩余4条评论

35

如果你在Visual Studio中同时打开了一个XML文件和一个XSD文件,并且正确定义了命名空间,它会自动将XML文件与XSD文件进行匹配,不需要手动关联文件。

定义命名空间的方法:

在XML文件的根元素中:

<Data xmlns='http://yourdomain.com/yourschema.xsd'>
    ...
</Data>

在XSD文件的模式元素中:

<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://yourdomain.com/yourschema.xsd"
    xmlns:this="http://yourdomain.com/yourschema.xsd"
    elementFormDefault="qualified">
    ...
</xs:schema>

当你的模式具有目标命名空间时,请注意在模式中使用类型

因为你在模式中指定了一个targetNamespace,所以对于模式中定义的类型的任何引用都需要使用命名空间前缀(这就是我们在上面的<xs:schema />元素中添加xmlns:this属性的原因)。

<!-- Define the type as normal -->
<xs:complexType name="Row">
    <xs:sequence>
        <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1" />
        <xs:element name="Value" type="xs:float" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
</xs:complexType>
<!-- Use the type (note the "this:" prefix) -->
<xs:element name="Row" type="this:Row" minOccurs="0" maxOccurs="unbounded" />

3

这里的另一个故障点是 Windows 7 "阻止" 模式文件... 在磁盘上右键单击 xsd 文件,选择“属性” > “常规”,如果被阻止了,会有一个“解除阻止”按钮。 这导致我在 VS2012 中进行 XML 验证失败。


1
你的 XSD 文件中是否包含一个名为 "targetNamespace" 的属性 /schema/@targetNamespace,并且它与你在 XML 中引用的命名空间相似吗?
举例:

XSD:

<xs:schema .... targetNamespace="Datafile.xsd" ... >

XML

<data xmlns="Datafile.xsd" >...</data>

另请参阅:Visual Studio 2010中XML/XSD智能感知无法工作


0
我曾经遇到过同样的问题,但是VS已经正确引用了我的模式。结果发现我尝试验证的文件没有一个“xml”文件扩展名。在我的文件名末尾添加了“.xml”,验证开始工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接