簡體   English   中英

xs:任何xs:xsd的所有標記

[英]xs:any in xs:all tag for xsd

我有一個場景,我需要一個xsd,用於驗證幾個xml的幾個共同點。 例如,

XML1:

<myXml1>
<myTag>
<someTag>..</someTag>
<requiredTag>..</requiredTag>
<someotherTag>..</someotherTag>
</myTag>
<myXml1>

XML2:

<myXml1>
<myTag>
<requiredTag>..</requiredTag>
<otherTag>..</otherTag>
</myTag>
<myXml1>

我需要一個通用的xsd,以便驗證共有“ requiredTag ”的xmls並讀取它的值。

我嘗試使用<xs:any>但僅在xs:sequence支持,而在xs:all不支持。 我的requiredTag可以在myTag下的任何地方。

我想使用這個xsd來創建使用jaxb讀取值的類。

任何幫助表示贊賞。

提前致謝。 :)

如果您可以使用XSD 1.1進行驗證,則可以使用:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
    <xs:complexType name="myTagType">
        <xs:sequence>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
            <xs:element name="requiredTag" type="xs:string"/>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
        </xs:sequence>
    </xs:complexType>
 ...
</xs:schema>

不幸的是,這在XSD 1.0中失敗了,因為它違反了Unique Particle Atribution約束。

一種解決方法包括為any元素和requiredTag使用不同的命名空間。 聲明具有所需標記的命名空間的模式:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified" 
           xmlns="required-tag-ns" 
           targetNamespace="required-tag-ns">
    <xs:element name="requiredTag" type="xs:string"/>
</xs:schema>

現在將其導入到您的模式中(您將需要其中一個的前綴):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified" 
           targetNamespace="any-tag-ns" 
           xmlns="any-tag-ns" 
           xmlns:r="required-tag-ns">

    <xs:import namespace="required-tag-ns" schemaLocation="required.xsd"/>

    <xs:complexType name="myTagType">
        <xs:sequence>
            <xs:any namespace="any-tag-ns" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
            <xs:element ref="r:requiredTag"/> <!-- now it works in 1.0 because the ambiguity was removed -->
            <xs:any namespace="any-tag-ns" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
        </xs:sequence>
    </xs:complexType>
   ...
</xs:schema>

上面的XSD 1.1架構或XSD 1.0架構將驗證這些情況:

<myTag>
    <requiredTag>..</requiredTag>
</myTag>
<myTag>
    <someTag>..</someTag>
    <requiredTag>..</requiredTag>
</myTag>
<myTag>
    <requiredTag>..</requiredTag>
    <someotherTag>..</someotherTag>
</myTag>
<myTag>
    <someTag>..</someTag>
    <someotherTag>..</someotherTag>
    <someotherTag>..</someotherTag>
    <requiredTag>..</requiredTag>
    <someotherTag>..</someotherTag>
</myTag>
<myTag>
    <someTag>..</someTag>
    <requiredTag>..</requiredTag>
    <someTag>..</someTag>
    <someTag>..</someTag>
    <someotherTag>..</someotherTag>
</myTag>

但他們不會驗證這些情況:

<myTag> <!-- missing requiredTag -->
    <someTag>..</someTag>
    <someotherTag>..</someotherTag>
</myTag>
<myTag> <!-- too many requiredTags -->
    <requiredTag>..</requiredTag>
    <requiredTag>..</requiredTag>
    <someotherTag>..</someotherTag>
</myTag>

在XSD 1.1版本中,您不需要命名空間。 在XSD 1.0解決方案中,您的實例requiredTag使用其命名空間限定requiredTag

<myXml xmlns="any-tag-ns"
       xmlns:r="required-tag-ns"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="any-tag-ns your-schema-file.xsd">

    <myTag>
        <someTag>..</someTag>
        <someotherTag>..</someotherTag>
        <someotherTag>..</someotherTag>
        <r:requiredTag>..</r:requiredTag>
        <someotherTag>..</someotherTag>
    </myTag>
    ...
</myXml>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM