奇怪的XML架构

时间:2009-11-02 16:10:59

标签: 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</field>
<field name="Interceptions">2</field>
<field name="Yardage">2000</field>

因此,由于所有元素都被命名为“field”,因此我无法为此创建架构。这就是我到目前为止所做的:

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

maxOccurs元素的field的默认值为1(因此请尝试将其设置为无限制),simpleType可能不包含属性或子元素。

我相信以下示例正在发挥作用:

XSD:

<?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:

<?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>

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

答案 1 :(得分:2)

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

<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之外,我不会看到你能做些什么。