【问题标题】:Creating XML-Schema with unbound number of elements in all创建具有无限数量元素的 XML-Schema
【发布时间】:2014-08-24 19:44:49
【问题描述】:

我有一个具有以下结构的 XML 数据

<Data>
   <Name />
   <Code />
   <Prodprop>
      <key />
      <value />
   </Prodprop>
   <Prodprop>
      <key />
      <value />
   </Prodprop>
   <Tag />
   <Blub />
</Data>

我需要这个数据的 XML 模式,但是标签可以以任何顺序出现,但所有 Prodprop 都是连续的。所有其他元素只需要一次或最多一次因此以下数据也是有效的。

 <Data>
       <Code />
       <Name />
       <Tag />
       <Prodprop>
          <key />
          <value />
       </Prodprop>
       <Prodprop>
          <key />
          <value />
       </Prodprop>
    </Data>

这是我的(而且我知道这是不可能的)架构。

    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="Data" type="DataType" /> 
  <xsd:complexType name="DataType">
        <xsd:all>
          <xsd:element name="Name" type="xsd:string" />
          <xsd:element name="Code" type="xsd:string" />
          <xsd:element maxOccurs="unbounded" name="Prodprop" type="ProdpropType" />
          <xsd:element name="Tag" type="xsd:string" />
          <xsd:element name="Blub" type="xsd:string" />
        </xsd:all> 
   </xsd:complexType>
    <xsd:complexType name="ProdpropType">
        <xsd:sequence>
          <xsd:element name="key" type="xsd:string" />
          <xsd:element name="value" type="xsd:string" />
        </xsd:sequence> 
       </xsd:complexType> 
  </xsd:schema>

是否有可能为这个 szenario 制作一个有效的 xml 架构?

【问题讨论】:

  • 我认为您尝试做的事情是不可能的。但是一个好主意,接近你所描述的,是将 Prodprop 元素包装在另一个元素中,例如产品道具清单。使用这种方法,您将拥有 Prodprop 的所有内容作为一个组,并且无论何时移动它们,它们都会作为一个整体移动。
  • 我已经用一个组尝试过,但是 all-tag 只允许普通元素,没有组

标签: xml xsd schema


【解决方案1】:

我认为如果不使用 xpath 中的一些复杂的东西,你想要做的事情是不可能的。

@C。 M. Sperberg-McQueen 是对的。这是可能的,但是,如果您不将要求更改为更简单的内容,则必须提供标签可能具有的所有可能的顺序组合。这个解决方案虽然非常复杂和麻烦,但完全合法。

一个好主意,接近你所描述的,是将 Prodprop 元素包装在另一个元素中,例如产品道具清单。使用这种方法,您将拥有所有 Prodprop 项目作为一个批次,并且无论何时移动它们,它们都会作为一个整体移动。

你可以在线测试here

检查这个: XSD

<xsd:schema attributeFormDefault="unqualified"
    elementFormDefault="qualified" version="1.0"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="Data" type="DataType" />
    <xsd:complexType name="DataType">
        <xsd:all>
            <xsd:element name="Name" type="xsd:string" />
            <xsd:element name="Code" type="xsd:string" />
            <xsd:element name="ProdpropList" type="ProdpropListType" />
            <xsd:element name="Tag" type="xsd:string" />
            <xsd:element name="Blub" type="xsd:string" />
        </xsd:all>
    </xsd:complexType>

    <xsd:complexType name="ProdpropListType">
        <xsd:sequence>
            <xsd:element name="Prodprop" type="ProdpropType"
                maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ProdpropType">
        <xsd:sequence>
            <xsd:element name="key" type="xsd:string" />
            <xsd:element name="value" type="xsd:string" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

XML

<Data>
    <Name />
    <Code />
    <ProdpropList>
        <Prodprop>
            <key />
            <value />
        </Prodprop>
        <Prodprop>
            <key />
            <value />
        </Prodprop>
    </ProdpropList>
    <Tag />
    <Blub />
</Data>

【讨论】:

  • 我已经有了数据,并且正在为数据创建一个模式。这就是问题所在。。但正如我猜对的那样,这只有在定义元素顺序并因此使用序列时才有可能(或可管理(因为有更多标签)......
  • 在您的问题中您提到了but the tags can appear in any order,所以我认为这是理所当然的。当然这也是一个解决方案,但是我排除了它,因为您特别提到不会订购标签。无论如何,我很高兴你找到了解决方案。玩得开心
【解决方案2】:

如果我正确理解您的问题,您希望 Data 元素的内容包含

  • 零个或多个(?还是一个或多个?)Prodprop 元素的序列
  • 在名称、代码、标签、Blub、Foo、Bar、Baz 等任意数量的元素之前或之后,每个元素最多只能出现一次,其中一些是可选的

声称这是不可能的答案是不正确的。您描述的内容模型并非不可能;它显然是一种常规语言,并且可以用 XSD 内容模型清楚地表达。这当然是可能的;但是非常不方便。

为满足您陈述的要求,您需要为您描述的语言(允许的子级序列)创建一个正则表达式,然后将该正则表达式写成 XSD 内容模型。 XSD 通过要求内容模型“确定性”来保持内容模型“简单”的不切实际的尝试使任务变得复杂,但您可以在其他 StackOverflow 问题 hereherehere 中找到有关如何进行的描述(最后一个问题是关于 DTD,而不是 XSD,但同样的原则也适用)。

如果您不想拥有一个复杂的内容模型,那么您可以通过修改您的需求来实现一个更简单的模型,以便它们更好地适应您的验证技术。

  • 正如@alkis 已经建议的那样,您可以将 Prodprop 元素包装在包装器元素中,然后使用简单的 XSD 1.0 all 组。
  • 您可以为子项指定所需的顺序,除非它们出现的顺序为您的应用程序提供了一些信息。 (如果序列不包含信息,则不需要允许它发生变化。)

【讨论】:

  • 你说得对,这是可能的。 OP 可以通过指定所有可能的组合或使用一些复杂的 xpath 来实现所需的结果。我将更改我的答案以包含这种可能性,但是,即使是 5 个标签,它也几乎无法使用。即使添加一个标签也会使 xsd 不可持续,这就是为什么我说这种尝试是不可能的。我会尽量记住,下次我必须为 OP 提供所有可能性。谢谢你的提醒。 +1
  • 感谢您提供这种可能性。但由于有更多的标签(至少 20 个),它会使 xsd 有点太复杂而无法处理。因此几乎不可能。不过还是谢谢
  • @KatharinaKaiser,您无需为以某种方式解决您的问题而向我道歉。我确实认为仔细区分“乏味”或“复杂”或“不是我想做的事情”和“不可能”是有用的。
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多