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

Jim*_*eth 92 xml intellisense xsd visual-studio xsd-validation

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

我有一个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更宽容/更灵活......)

mar*_*c_s 135

吉姆

您需要将Visual Studio中的XML文档与您拥有的XSD文件相关联 - 您应该在XML文档的"属性"窗口中看到类似的内容:

替代文字

镜子1

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

替代文字

镜子1

确保Visual Studio的错误列表窗口可见(菜单视图>错误列表).这将显示XML和XSD架构定义之间的所有不一致.

完成所有这些后,Visual Studio XML编辑器应使用蓝色波浪线在编辑器中突出显示XML问题:

替代文字

镜子1

  • @jim不确定你是否遇到了同样的问题,但是在我意识到必须在编辑器中打开XML文件并且在调用属性时焦点必须在编辑器中**时,我花费了大量的时间.窗口.只有这样,您才能获得"XML文档"属性,您可以在其中分配模式.如果焦点位于解决方案资源管理器中,则"属性"窗口仅显示文件属性,即不可能在那里进行模式分配. (36认同)
  • 我认为您应该在答案本身中添加@herzbube 的发现。 (2认同)

Ros*_*Nab 33

您无需在Visual Studio中手动关联文件 - 如果您同时打开它们并且正确定义了命名空间,它将自动将XML文件与XSD文件匹配.

要定义命名空间:

在XML文件的根元素中:

<Data xmlns='http://yourdomain.com/yourschema.xsd'>
    ...
</Data>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

有关targetNamespace时在架构中使用类型的说明

因为您targetNamespace在模式中指定了a ,所以对模式中定义的类型的任何引用都需要以命名空间为前缀(这就是我们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" />
Run Code Online (Sandbox Code Playgroud)