Visual Studio 2010中的XSD key / keyref intellisense验证支持

时间:2012-03-09 18:01:38

标签: xml visual-studio-2010 xsd intellisense keyref

我一直在寻找答案而找不到答案:

  • Visual Studio 2010中是否通过 Intellisense 支持XSD密钥/密钥验证?
  • 如果是的话,如何让它发挥作用?
  • 如果不是,Visual Studio中是否有(内置)方法在具有XSD架构的XML中进行密钥/引用验证?

谢谢!

更新:请注意,问题不在于如何验证具有XSD文件的XML。我特别询问Visual Studio中的 key / keyref intellisense /任何支持,它似乎根本没有添加。

3 个答案:

答案 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将生成错误:

https://stackoverflow.com/a/2866428/344638

答案 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-->