奇怪的XML模式

奇怪的XML模式,xml,xsd,schema,Xml,Xsd,Schema,好的,我的任务是从供应商提供给我们的XML文档中编写XSD。这个供应商没有他们可以提供的XSD,所以我是逆向工程。以下是此xml的形成方式示例: <field name="id">1</field> <field name="Sport">Football</field> <field name="Position">Quarterback</field> <field name="Touchdowns">7&l

好的,我的任务是从供应商提供给我们的XML文档中编写XSD。这个供应商没有他们可以提供的XSD,所以我是逆向工程。以下是此xml的形成方式示例:

<field name="id">1</field>
<field name="Sport">Football</field>
<field name="Position">Quarterback</field>
<field name="Touchdowns">7</field>
<field name="Interceptions">2</field>
<field name="Yardage">2000</field>
1
足球
四分卫
7.
2.
2000
因此,由于所有元素都被命名为“field”,因此我在为此创建模式时遇到了困难。这就是我到目前为止所做的:

<xs:element name="field" type="xs:int">
     <xs:simpletype>
         <xs:attribute name="name" type="xs:string" default="id"/>
     </xs:string>
</xs:element>

我遇到的问题是,所有元素都将具有相同的名称。我用来编写xsd的软件有问题。我有正确的方法吗


感谢您的帮助。

您基本上拥有一个类型,它是您以不同方式扩展的基本元素。如果代码有点错误,请原谅,我没有尝试验证模式,我是从内存中编写的,这不是编写模式的好方法,但你应该明白

<xsd:complexType name="field">
    <xsd:simpleContent>
        <xsd:extension>
            <xsd:attribute name="name" />
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

使用属性名称定义基本元素(对属性类型没有约束)。这将验证原始帖子中的所有示例

然后您可以尝试扩展:

<xsd:complexType name="idField">
    <xsd:complexContent>
        <xsd:extension base="field">
            ...restrict it in here
        </xsd:extension>
    <xsd:complexContent>
</xsd:complexType>

…把它限制在这里
对每个变体都做类似的操作,基本上使它们成为主定义的子类型

我意识到这个“答案”并不能给出一个明确的答案,但希望它能把你推向正确的方向


如果做不到这一点,我看不出除了让供应商重写他们的XML之外还能做什么。

您的
字段的
maxOccurs
元素的默认值是1(因此请尝试将其设置为无界)。此外,
simpleType
可能不包含属性或子元素

我相信下面的例子是有效的:

XSD:


XML:


1.
足球
四分卫
7.
2.
2000

我在
name
类型中使用了xs:string,但是我想您可以定义一个新的数据类型来强制执行某些关键字…

字段元素不应该是string类型吗?不,因为第一个元素的实际内容是id,它是int.Sry-应该更具描述性-示例xsd只包含第一个元素(id字段)事实上,我刚刚意识到可能有一种方法,在我编辑的时候别挂断,该死的我打字太快,思维太慢……是的,所以编辑提出了一种方法来扩展基本字段类型以匹配不同的专业,但我不完全确定它到底有多准确/有效。我认为,尽管有这样一个通用模式是有效的,但它并不是有效的除了实例XML文件的正式定义之外,还可以添加很多内容。但是,这可能是创建有效架构的最简单方法(+1)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="fields">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="field"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="field">
    <xs:complexType>
        <xs:attribute name="name" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
<?xml version="1.0" ?>
<fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="fields.xsd">
    <field name="id">1</field>
    <field name="Sport">Football</field>
    <field name="Position">Quarterback</field>
    <field name="Touchdowns">7</field>
    <field name="Interceptions">2</field>
    <field name="Yardage">2000</field>
</fields>