为下面的xml创建xsd模式
本文关键字:创建 xsd 模式 xml | 更新日期: 2023-09-27 18:04:15
我有下面的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种不同的规则类型。
我正在考虑使用一个元素组来表示每个规则类型,但我不太确定如何映射它。
如果您想为各种规则类型保留相同的元素(规则)名称,那么您定义的抽象元素(属性abstract="true"
)及其所有子元素将具有xs:ComplextContent>xs:extension
,其基本属性等于您的抽象类型名称。在XML中,每个规则元素必须有xsi:type
属性来区分元素的具体类型。说明和示例在这里。
如果您希望/可以为每个规则类型使用不同的元素名称,您可以使用替换组。您的共同祖先同样由属性抽象定义。具体类型定义为xs:属性substitutionGroup
等于共同祖先名称的元素。
您使用jaxb吗?使用xsd,您可以使用继承,如果需要或不需要元素,您可以使用minOccurs/maxOccurs。
这里有一个例子,我从头开始写,没有测试,也许有错误:
<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>