XML在Visual Studio IDE中使用XSD验证
-
01-10-2019 - |
题
我知道我以前做过这一点,但是今天它不起作用,也无法在任何解释如何做的地方找到。可能是我缺乏睡眠,但我怀疑格林林斯。
我有一个XML文档和一个装有XSD的目录,可以定义它。如何设置视觉IDE以将验证失败通知我,然后在给定上下文中提供有效标签和属性的IntelliSense列表?
我尝试了什么:
- 我已经使用XML文档将XSD添加到项目中。
- 我已经将XSD添加到XML模式列表(在XML / schemas ...菜单项下。)。
- 我什至将示意图和非AMEMESPACESEPACESCHEMALICATION属性包含在XML文档中。
Visual Studio仍然没有放弃任何有用的调试或编辑信息。我尝试了2010年和2008年(我以前在2008年以前做过)
更新: 我有另一个开发人员尝试一下,这也对他失败了。他知道他已经使用了其他XML文档来完成工作,并且它起作用了。然后,我下载了氧XML编辑器,并且在同一XML和XSD文件上工作正常,因此这些文件似乎很好(或氧气更宽容 /灵活。
解决方案
您需要将Visual Studio中的XML文档与您拥有的XSD文件相关联。
您应该在XML文档的属性窗口中看到类似的内容:
在XML架构集编辑器中(当您在属性窗口中的“架构”文本框中单击(...)省略号时打开),您需要确保存在架构。另外,请确保
Use
该模式的列已启用 - 如果没有,请单击 - 您将获得选项的下拉列表,请选择Use
一个带有绿色检查标记:确保可见Visual Studio的错误列表Windows(菜单视图>错误列表)。这将显示XML和XSD模式定义之间的所有不一致之处。
一旦所有这些都到位,Visual Studio XML编辑器应使用蓝色Squigglies在编辑器中突出显示XML的问题:
其他提示
您无需手动将视觉工作室中的文件关联 - 它将 自动地 如果您两个都打开了XML文件,则将XML文件匹配,并且您的名称空间正确定义了。
定义名称空间:
在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" />
这里的另一个故障点是Windows 7“阻止”架构文件...右键单击磁盘上的XSD文件,属性>一般,如果被阻止,您将拥有一个“ unblock”按钮。这导致我的XML验证在VS2012中失败。
您的XSD包含一个属性吗 "targetNamespace"
/schema/@targetNamespace
那类似于您在XML中引用的名称空间吗?
例子:
XSD:
<xs:schema .... targetNamespace="Datafile.xsd" ... >
XML:
<data xmlns="Datafile.xsd" >...</data>
我遇到了同样的问题,但是VS已经正确地引用了我的架构。事实证明,我试图验证的文件没有“ XML”文件扩展名。将.xml添加到我的文件名的末尾,并且验证开始工作。