首页 > 解决方案 > 为密钥设置 xsd 并验证 xml

问题描述

我正在尝试为 xml 设置一个 xsd,并确保元素没有重复的子元素值。下面是一个无效的 xml 示例。

<NonSectorSpecific>
    <ElementTypes>
      <item>
        <Type>textarea</Type>
      </item>
      <item>
        <Type>select</Type>
      </item>
      <item>
        <Type>select</Type>
      </item>
    </ElementTypes>
  </NonSectorSpecific>

我已经创建了 xsd,它可以正确验证架构,但不能因为 Type 元素的键无效而引发异常。

<xs:schema
  targetNamespace="http://internal.gug.icmemo.com/test"
  elementFormDefault="qualified"
  xmlns="http://internal.gug.icmemo.com/test"
  xmlns:o="http://internal.gug.icmemo.com/test"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="Configuration">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="NonSectorSpecific">
          <xs:complexType>
            <xs:sequence>
              <xs:element ref="ElementTypes"  minOccurs="0" maxOccurs="unbounded"/>          
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:unique  name="PKElementType">
      <xs:selector xpath="NonSectorSpecific/ElementTypes/item/Type"/>
      <xs:field xpath="."/>
    </xs:unique >
 </xs:element>  

  <xs:complexType name="ElementType">
    <xs:sequence>
      <xs:element name="Type" type="xs:string" />
    </xs:sequence>
  </xs:complexType>   
  <xs:element name="ElementTypes">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="item" type="ElementType"/>
      </xs:sequence>
    </xs:complexType>      
  </xs:element>  
</xs:schema>

老实说,我已经很久没有使用 XMl 了,而且似乎找不到太多关于处理元素值(而不是属性)处的键的在线文档。

标签: xmlxsdkeykeyref

解决方案


您已在Configuration元素上定义了约束,但您发布的示例 XML 中没有Configuration元素。如果要施加一个约束,即没有 NonSectorSpecific元素有两个Type具有相同值的 ,则需要在元素声明中为 定义约束NonSectorSpecific

顺便说一句,在我看来,依靠“在线文档”,您正在用一只手绑在背后工作。最好的信息可以在您必须付费购买的书籍中找到:您将从一位作者那里获得更好的信息,这位作者已经花费了六个月到一年的时间来寻找呈现该主题的最佳方式。我有两本关于 XSD 的书,分别是 Eric van der Vlist 和 Priscilla Walmsley 所著,您可以毫不费力地从中找到这个问题的答案。


推荐阅读