Xml XSD:允许任何顺序的任何未知元素

Xml XSD:允许任何顺序的任何未知元素,xml,xsd,Xml,Xsd,我需要编写一个XSD模式。在此架构中,一些元素是已知的且是必需的,其他元素是未知的且是可选的: <father> <childMandatory1 /> <childMandatory2 /> <childOptionnal1 /> </father> 或:(更改强制儿童顺序) 我知道强制儿童(但不知道他们的顺序)。但我不知道是否会有任何可选的孩子(任)(如果有,他们的名字) 我尝试使用“xs:all”

我需要编写一个XSD模式。在此架构中,一些元素是已知的且是必需的,其他元素是未知的且是可选的:

<father>
    <childMandatory1 />
    <childMandatory2 />
    <childOptionnal1 />
</father>

或:(更改强制儿童顺序)


我知道强制儿童(但不知道他们的顺序)。但我不知道是否会有任何可选的孩子(任)(如果有,他们的名字)

我尝试使用“xs:all”,但“xs:all”不允许使用“any”:


我尝试了顺序,但我应该知道元素的顺序。(我不知道)


我尝试了选择,但选择不能与任何和某些强制性元素一起工作。(我想确保强制元素存在)

根据您的要求,您已经达到了唯一粒子属性规则,这一规则非常重要

问题在于将任意顺序与任意元素组合在一起。处理器无法确定某个元素属于哪个声明。
childMandatory1
属于
xs:any
还是属于元素声明

只要使用
xs:any
,您就很容易遇到这个问题。这就是为什么允许序列与
xs:any
组合,但前提是序列中的项是必需的且按顺序排列的,否则同样无法确定哪个元素属于哪个声明

如果创建这样一个XSD的原因是为了验证输入是否存在某些元素,那么可以切换到XSD 1.1,在那里可以使用
xs:assert
解决这个问题,或者可以使用不同的工具,如RelaxNg或Schematron,它们是替代的标准化XML模式语言

如果您想用它创建一个对象模型,您可能会运气不佳,因为即使您成功地做到了这一点,(反)序列化程序也无法区分彼此的声明

以下是XSD 1.1中的一个示例:

<xs:complexType name="BookType">
    <xs:all>
        <xs:any maxOccurs="unbounded" namespace="##any" />
    </xs:all>
    <xs:assert test="self::author | self::title | self:isbn" xpathDefaultNamespace="urn:test" />
</xs:complexType>


可以在XFront上找到一篇关于的好文章。它虽然古老,但在今天仍然非常适用。还有一个.

也许你应该在
xs:choice
@AlexanderPetrov中使用
xs:any
,这也会违反规则。嗯,我不这么认为,但这是有道理的!感谢您提供有关UPA的信息。我需要一个模式来验证xml,但主要是为了访问强制元素(使用jaxb对象)。我可以尝试使用XSD1.1来验证xml,然后使用xPath(而不是jaxb对象)来读取和使用数据。
<xs:element name="father">
        <xs:complexType>
            <xs:all>
                <xs:element ref="childMandatory1" />
                <xs:element ref="childMandatory2" />
                <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> 
        <!-- error here ! -->
                </xs:all>
            </xs:complexType>
    </xs:element>
<xs:complexType name="BookType">
    <xs:all>
        <xs:any maxOccurs="unbounded" namespace="##any" />
    </xs:all>
    <xs:assert test="self::author | self::title | self:isbn" xpathDefaultNamespace="urn:test" />
</xs:complexType>