【问题标题】:Make xml element unique using xsd使用 xsd 使 xml 元素唯一
【发布时间】:2013-10-22 19:53:19
【问题描述】:

我有一个 xml 文件,下面有关联的 xsd:

元素 ContentTitle 需要是唯一的。我已经进行了一些调查并知道使用 xs:unique 属性,但我还没有让它在我的场景中正常工作。

谁能提供建议?

  <xs:element name="AllMeta">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="WikiMeta">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ContentTitle" type="xs:string" minOccurs="1" maxOccurs="1" />
              <xs:element name="PageTitle" type="xs:string" minOccurs="1" maxOccurs="1" />
              <xs:element name="PageMetaDescription" type="xs:string" minOccurs="1" maxOccurs="1" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    xs:complexType 之后为AllMeta 添加一个xs:unique 元素:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="AllMeta">
        <xs:complexType>
          <xs:sequence>
            <xs:element maxOccurs="unbounded" name="WikiMeta">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="ContentTitle" type="xs:string" minOccurs="1" maxOccurs="1" />
                  <xs:element name="PageTitle" type="xs:string" minOccurs="1" maxOccurs="1" />
                  <xs:element name="PageMetaDescription" type="xs:string" minOccurs="1" maxOccurs="1" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
        <xs:unique name="uniqueContentTitle">
          <xs:selector xpath="WikiMeta"/>
          <xs:field xpath="ContentTitle"/>
        </xs:unique>    
      </xs:element>
    </xs:schema>
    

    那么,这个 XML 文档实例将是有效的:

    <?xml version="1.0" encoding="UTF-8"?>
    <AllMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="try.xsd">
      <WikiMeta>
        <ContentTitle>One</ContentTitle>
        <PageTitle></PageTitle>
        <PageMetaDescription></PageMetaDescription>
      </WikiMeta>
      <WikiMeta>
        <ContentTitle>Two</ContentTitle>
        <PageTitle></PageTitle>
        <PageMetaDescription></PageMetaDescription>
      </WikiMeta>
    </AllMeta>
    

    并且此 XML 文档实例将无效:

    <?xml version="1.0" encoding="UTF-8"?>
    <AllMeta xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="try.xsd">
      <WikiMeta>
        <ContentTitle>One</ContentTitle>
        <PageTitle></PageTitle>
        <PageMetaDescription></PageMetaDescription>
      </WikiMeta>
      <WikiMeta>
        <ContentTitle>One</ContentTitle>
        <PageTitle></PageTitle>
        <PageMetaDescription></PageMetaDescription>
      </WikiMeta>
    </AllMeta>
    

    验证器(在本例中为 Xerces-J)将给出如下错误消息:

    [Error] try.xml:10:37: cvc-identity-constraint.4.1: Duplicate unique value [One] declared for identity constraint "uniqueContentTitle" of element "AllMeta".
    c:/gd/usr/kjh/proj/try/xsd/try.xml: 219 ms (9 elems, 1 attrs, 0 spaces, 49 chars)
    

    【讨论】:

    • 非常清晰的解释 - 比其他地方的文档要好得多 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多