我一直在寻找答案而找不到答案:
谢谢!
更新:请注意,问题不在于如何验证具有XSD文件的XML。我特别询问Visual Studio中的 key / keyref intellisense /任何支持,它似乎根本没有添加。
答案 0 :(得分:2)
Visual Studio 2012现在支持验证XML文档实例,这些实例受引用模式中定义的key / keyref约束。
但是,当架构文档错误地使用key / keyref时,Visual Studio不会为架构文档本身提供任何错误 - 与某个文档是否符合架构无关。
具体而言,根据以下SO帖子,模式中定义的key / keyref元素必须在选择器xpath语句中使用名称空间:
https://stackoverflow.com/a/4492004/344638
引用:
此外 - 这是一个问题 - 关键限制无法识别默认命名空间。您必须始终在选择器xpath的每个部分前面添加您正在查找的元素的名称空间前缀。如果你没有命名空间前缀 - 很难,你需要添加一个。这是标准的限制。
以下SO帖子提供了使用key / keyref,XML文档实例和基于C#的手动验证程序的模式的完整示例。架构和XML文档实例在Visual Studio中正确验证 - 如果文档违反架构的key / keyref约束,Visual Studio将生成错误:
答案 1 :(得分:1)
VS2010目前不支持此功能,VS2012中也不支持此功能(根据MS技术支持)。
也许他们会在未来的版本中支持它......
答案 2 :(得分:0)
刚刚在VS 2013和VS 2015中尝试过。他们现在确实验证了key / refkey。它虽然在父级别出现了警告。
但正如@antiduh所说,他们仍然不检查xsd文件。所以你真的需要确保xsd中的键/ refkey是正确的。
花了我几个小时才弄清楚一个简单的样本。即使sample on MSDN也不起作用。我不得不稍微修改一下。
首先,请确保您知道how to let Visual Studio validate an xml against an xsd of your choice。
然后使用以下示例xsd和xml进行密钥/ refkey验证。请注意,警告是关闭根元素,而不是违反键/ ref规则的元素。
xsd文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="namespace1"
xmlns:r="namespace1"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="A" type="r:A" maxOccurs="unbounded"/>
<xs:element name="B" type="r:B"/>
</xs:sequence>
</xs:complexType>
<xs:keyref name="dummy" refer="r:pNumKey">
<xs:selector xpath="r:A/r:part"/>
<xs:field xpath="@ref-number"/>
</xs:keyref>
<xs:key name="pNumKey">
<xs:selector xpath="r:B/r:part"/>
<xs:field xpath="@key-number"/>
</xs:key>
</xs:element>
<xs:complexType name="A">
<xs:sequence>
<xs:element name="part" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="ref-number" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="B">
<xs:sequence>
<xs:element name="part" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="key-number" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
xml文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="namespace1">
<A>
<!-- if the ref-number is equal to one of the key-number, the validation will pass -->
<part ref-number="1"/>
</A>
<A>
<!-- if the ref-number is not equal to one of the key-number, the validation will give error -->
<part ref-number="5"/>
</A>
<B>
<part key-number="1"/>
<part key-number="2"/>
<part key-number="3"/>
</B>
</root><!--you will see warnings here-->