我不确定以下内容的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>
对这样的结构建模有什么好的策略?
答案 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
标记,address
和city
标记是必需的,则不允许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>