你会如何在XML / XSD中描述这个?

时间:2011-03-29 09:24:58

标签: xml xsd structure

我不确定以下内容的XML结构是什么......

假设字段类型,例如< person>,可以具有不同的“风味”,例如person是仅由某个ID定义的本地引用,或者是与各种地址元素相关联的全局引用。什么是一个很好的XML结构,以便在模式(xsd文件)中描述变得容易?

我看到两种策略 - 机器人都有一些主要的缺点:

将人物类型作为一个单独的元素,比如< type>,然后我猜一个模式无法分辨哪些类型特定字段是强制性的:

<person>
   <type>local</type>
   <id>12345</id>
</person>
<person>
   <type>global</type>
   <name>Some Name</name>
   <address>Some Street 42</address>
   <city>Some City</some>
</person>

在这种情况下&lt; id&gt;只应对“本地”人员类型强制执行,并且与“全局”人员类型的字段类似。

另一个策略是为每个人子类型定义一个新的节点类型,但是我们不能说每个子类型实际上只是&lt; person&gt;的风格:

<personLocal>
   <id>12345</id>
</personLocal>
<personGlobal>
   <name>Some Name</name>
   <address>Some Street 42</address>
   <city>Some City</some>
</personGlobal>

对这样的结构建模有什么好的策略?

3 个答案:

答案 0 :(得分:1)

您可以使用以下(部分)架构:

    <xs:element name="person">
      <xs:complexType>
        <xs:choice>
          <xs:element name="id" type ="xs:int"/>
          <xs:sequence>
            <xs:element name="name" type="xs:string" />
            <xs:element name="address" type="xs:string" />
            <xs:element name="city" type="xs:string" />
          </xs:sequence>
        </xs:choice>
      </xs:complexType>
    </xs:element>

重要提示:xs:choice代码。

这将产生以下结果:

  • 如果person标记内的第一个标记是id标记,则不允许使用其他标记。
  • 如果person标记内的第一个标记是name标记,addresscity标记是必需的,则不允许id标记

答案 1 :(得分:0)

对我来说,我是这样做的:

<parent>
  <local>
    <person>
      <name />
      <adress />
      <city />
    </person>    
  </local>
  <global>
    <person>
      <name />
      <adress />
      <city />
    </person>    
  </global>
<parent>

或者像这样:

<person type='local'>
  <name />
  <adress />
  <city />
</person>    
<person type='global'>
  <name />
  <adress />
  <city />
</person>

:)

答案 2 :(得分:0)

一个workarround(我可能最终得到的)是定义如下的模式,因为不同的人类型(我解释的不止两个例子)可能包含一些相同的字段:

<xs:element name="person">
<xs:complexType>
  <xs:choice>
    <xs:element name="local">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="id" type ="xs:int"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    <xs:element name="global">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="name" type="xs:string" />
          <xs:element name="address" type="xs:string" />
          <xs:element name="city" type="xs:string" />
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:choice>
</xs:complexType>