【问题标题】:XSD from sample XML来自示例 XML 的 XSD
【发布时间】:2020-04-19 22:11:40
【问题描述】:

如何为这些示例 XML 标记编写 XSD?

              <Vote> 
                <UBF Name="DATE">2020-04-16</UBF>
                <UBF Name="SEC">22</UBF>
                <UBF Name="BATCHID">ABCD</UBF>
                <UBF Name="EFFECTIVE">2020-04-16</UBF>
                <UBF Name="TRACK">BCDE</UBF>
                <UBF Name="AUTH">EFGH</UBF>
                <UBF Name="COMMAMT">7.1</UBF>
                <UBF Name="SIZE">9.2</UBF>
                <UBF Name="PCT">8.2</UBF>
                <UBF Name="CIF">OT</UBF>
                <UBF Name="SECID">22</UBF>
                <UBF Name="EXPDATE">2020-11-30</UBF>
                <UBF Name="TOTSHAR">3.2</UBF>
            </Vote>

注意:所有元素/属性都是必需的,并且是按顺序传递的,不同的元素传递的值是不同的。例如,DATE 中的值应作为 yyyy-mm-dd 中的日期传递,而 BATCHID 中的值为 char(30),COMMAMT 中的值应作为小数传递。

我尝试使用在线 XML 到 XSD 转换器,我想出了以下代码。但是,它并没有解决为单个元素传递不同类型值的需要

                      <xs:element maxOccurs="unbounded" name="UBF">
                        <xs:complexType>
                          <xs:simpleContent>
                            <xs:extension base="xs:string">
                              <xs:attribute name="Name" type="xs:string" use="required" />
                            </xs:extension>
                          </xs:simpleContent>
                        </xs:complexType>
                      </xs:element>

谢谢!

【问题讨论】:

  • 这不是一个雇佣网站的代码编写。你需要展示你的努力
  • 感谢您的评论。我添加了更多细节

标签: xml xsd


【解决方案1】:

对于&lt;UBF /&gt; 元素,您需要的是简单类型 stringdateint 的联合十进制

<xs:simpleType name="ubfValuesUnion">
  <xs:union memberTypes="xs:string xs:date xs:int xs:decimal" />
</xs:simpleType>

&lt;UBF /&gt; 元素定义变为:

<xs:element name="UBF">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="ubfValuesUnion">
        <xs:attribute name="Name" use="required" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

这样就可以使用日期、字符串、整数和十进制数的不同值来验证您的 XML。

【讨论】:

  • 但是。如果我想具体限制每个属性值的通过怎么办?例如, 中的值应仅作为 yyyy-mm-dd 中的日期传递,不得以其他格式传递
  • @ user13357411 为此,您必须使用一种称为“类型替代”的功能。但是,这需要 XSD v1.1,并且会使您的架构非常复杂。我建议这种类型的验证让应用程序执行此操作,而不是将其放入架构中。您可以在xml.com/articles/2018/05/29/co-occurrence-cta-xsd 的第 5 节中阅读有关类型替代的信息
【解决方案2】:

您可以在以下位置找到 XML 架构定义语言 (XSD) 的最新文档:https://www.w3.org/TR/xmlschema11-1/

【讨论】:

    【解决方案3】:

    所有元素/属性都是必需的,并且是按顺序传递的,不同的元素传递的值是不同的。例如,DATE 中的值应作为 yyyy-mm-dd 中的日期传递,而 BATCHID 中的值为 char(30),COMMAMT 中的值应作为小数传递。

    您会发现 XSD 规范的这一部分非常很有用:https://www.w3.org/TR/xmlschema-2/ 它列出了所有内置的简单数据类型、它们的词法形式和约束。

    我尝试使用在线 XML 到 XSD 转换器

    总的来说,我认为这些转换器不是很有用。即使是一个简单的模式也可以允许许多不同的文档。单个示例文档不太可能捕获您的架构需要指定的所有内容。

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2012-10-07
      • 2014-07-25
      • 1970-01-01
      相关资源
      最近更新 更多