繁体   English   中英

您如何用XML / XSD描述呢?

[英]How would you describe this in XML/XSD?

我不确定以下内容将是一个好的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>

在这种情况下,<id>应该仅对“本地”人员类型是必需的,并且对于“全局”人员类型也应为必填字段。

另一种策略是为每个person子类型定义一个新的节点类型,但是我们不能说每个sub-type实际上只是<person>的一种形式:

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

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

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

    <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标签内的第person标签是id标签时,则不允许其他标签。
  • person标签内的第person标签为name标签时, addresscity标签为必填项,则不允许使用id标签。

对我来说,我是这样的:

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

:)

一种工作环境(我可能最终会遇到的一种工作环境)是按以下方式定义架构,因为不同的人员类型(除了我所解释的两个示例以外)可能包含一些相同的字段:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM