我有以下xml,它有xsd架构,但是很差,没有用于序列化。
<rulestruct>
<rule>
<type name="vector" />
<ruleident ruleidentifier="" />
<pattern type="" />
</rule>
<rule>
<type name="expression" />
<ruleident ruleidentifier="" />
<pattern type="" />
</rule>
<rule>
<type name="vector" />
<ruleident ruleidentifier="" />
<pattern type="" />
</rule>
<rule>
<type name="statement" />
<ruleident ruleidentifier="" />
<pattern type="" />
</rule>
<rule>
<type name="statement" />
<ruleident ruleidentifier="" />
<pattern type="" />
</rule>
</rulestruct>
每个规则结构都可以有1.N规则。每个规则都可以重复。必须预先订购。每个规则有1.N个元素,有些有9个元素,有些有10个,13个。有9个不同的规则类型。
我在考虑使用元素组来表示每个规则类型,但我不太确定如何映射它。
答案 0 :(得分:2)
如果要为各种规则类型保留相同的元素名称(规则),则定义了抽象元素(属性abstract="true"
),并且其所有子元素都将具有xs:ComplextContent>xs:extension
,其基本属性等于你的抽象类型名称。
在XML中,每个规则元素必须具有xsi:type
attrite以区分元素具体类型。
解释和示例是here。
如果您希望/可以为每种规则类型使用不同的元素名称,则可以使用替换组。您的共同祖先再次由属性abstract定义。具体类型定义为xs:元素,其属性substitutionGroup
等于共同祖先的名称。
解释和示例是here。
答案 1 :(得分:0)
这里有一个例子,我从头开始编写它而不进行测试,也许有错误:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc">
<xsd:annotation>
<xsd:appinfo>
<jaxb:globalBindings>
<xjc:simple />
</jaxb:globalBindings>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="rulestruct" type="PRuleStruct" />
<xsd:complexType name="PRuleStruct">
<xsd:sequence>
<xsd:element name="rule" type="PRule" minOccurs="1" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="PRule">
<xsd:sequence>
<xsd:element name="vector" type="PVector" minOccurs="1" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
您已经看到通常有很多解决方案可以解决您的问题。我的选择通常是使用继承和更少的标记,并使用名称。我的目的是:
<rules>
<ruleVector ruleidentifier="sample" patternType="sample">
</ruleVector>