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

问题描述 投票:91回答:5

我知道我以前做过这个,但今天不行,也找不到解释怎么做的地方。这可能是我的睡眠不足,但我怀疑是小鬼。

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

我尝试过的:

  • 我已经使用XML文档将XSD添加到项目中。
  • 我已将XSD添加到XML Schema列表中(在XML / Schemas ...菜单项下)。
  • 我甚至将schemaLocation和noNamespaceSchemaLocation属性包含在XML文档中。

Visual Studio仍然没有放弃任何有用的调试或编辑信息。我试过了2010年和2008年(我在2008年之前就已经做过了)

更新:我有另一个开发人员尝试这个,它也失败了。他知道他已经使用其他XML文档完成了它并使其工作。然后我下载了Oxygen XML编辑器,它在相同的XML和XSD文件上运行良好,所以文件看起来很好(或者Oxygen更宽容/更灵活......)

xml visual-studio xsd intellisense xsd-validation
5个回答
130
投票

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

  1. 您应该在XML文档的“属性”窗口中看到类似的内容: XML Properties > Schema
  2. 在XML模式集编辑器中(单击“属性”窗口中“模式”文本框中的(...)省略号时打开),您需要确保存在模式。此外,请确保启用该架构的Use列 - 如果没有,请单击它 - 您将获得一个选项下拉列表,选择带有绿色复选标记的Use列表: XML Schema Selector
  3. 确保Visual Studio错误列表窗口可见(菜单视图>错误列表)。这将显示XML和XSD架构定义之间的所有不一致。
  4. 完成所有这些后,Visual Studio XML编辑器应使用蓝色波浪线在编辑器中突出显示XML问题: Example of Error

33
投票

您无需在Visual Studio中手动关联文件 - 如果您同时打开它们并且正确定义了命名空间,它将自动将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时在架构中使用类型的说明

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

<!-- 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文件,属性>常规,如果它被阻止,您将有一个“取消阻止”按钮。这导致我的XML验证在VS2012中失败。


1
投票

你的xsd是否包含一个属性"targetNamespace" /schema/@targetNamespace,它类似于你在xml中引用的命名空间?

例子:

XSD:

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

XML:

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

另见:XML/XSD intellisense not working in Visual Studio 2010


0
投票

我有同样的问题,但VS已正确引用我的架构。原来我试图验证的文件没有'xml'文件扩展名。在我的文件名末尾添加.xml,验证开始起作用。

© www.soinside.com 2019 - 2024. All rights reserved.