2010-07-01 101 views
84

我知道我之前已经完成了这项工作,但它今天无法工作,我也无法找到解释如何执行此操作的任何地方。这可能是我缺乏睡眠,但我怀疑是小孩。在Visual Studio IDE中使用XSD进行XML验证

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

我曾尝试:

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

Visual Studio仍然没有放弃任何有用的调试或编辑信息。我尝试了2010年和2008年(我以前在2008年之前完成过这项工作,我认为)

更新:我有另一位开发人员尝试了这一点,但他也失败了。他知道他已经用其他XML文档完成了它,并使其工作。然后我下载氧XML编辑器,它在相同的XML和XSD文件工作得很好,所以这些文件似乎是罚款(或氧气是更宽容/灵活。)

回答

115

吉姆,

您需要在XML文档中的Visual Studio与XSD文件相关联,你有 - 你应该看到像这样的XML文档的属性窗口:

alt text

Mirror 1

在XML模式集编辑器中(当您在属性窗口的“模式”文本框中单击(...)省略号时打开),您需要确保您的模式存在。此外,请确保该架构Use列启用 - 如果不是,点击它 - 你会得到的选项的下拉列表,挑一个Use与绿色的勾号:

alt text

Mirror 1

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

一旦所有的即到位,在Visual Studio XML编辑器应该使用蓝色squigglies突出的编辑与你的XML问题:

alt text

Mirror 1

+0

谢谢,这是一个很好的详细解释,但我仍然没有工作。我不知道你可以从这样的属性中获得模式列表。 – 2010-07-01 20:49:53

+0

@Jim McKeeth:如果您修改XML并再次保存,该怎么办?有时XML验证需要一个触发器... – 2010-07-01 21:15:23

+0

即使它不适合我,我也接受了您的答案。我猜测我的系统刚刚结束,但我已经搬到新电脑上,现在一切正常。 – 2010-10-21 21:19:50

1

请问您的XSD包含属性“targetNamespace”/ schema/@ targetNamespace与您在xml中引用的命名空间类似吗?

实施例:

的xsd: <的xs:架构....的targetNamespace = “Datafile.xsd” ...>

XML: <数据的xmlns = “Datafile.xsd”>。 ..

又见XML/XSD intellisense not working in Visual Studio 2010

0

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

29

您不需要手动关联Visual Studio中的文件 - 它会自动将XML文件与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> 

的说明:

在XML文件中的根元素:

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

在XSD文件的架构元素当你有目标时你的模式名称空间

因为你指定在你的架构中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" /> 
2

失败的另一点这里是Windows 7的“堵”模式文件......在磁盘上的XSD文件,属性>常规右键单击,如果它阻止,你就会有一个“解除阻止”按钮。这导致我的XML验证在VS2012中失败。