为下面的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种不同的规则类型。

我正在考虑使用一个元素组来表示每个规则类型,但我不太确定如何映射它。

为下面的xml创建xsd模式

如果您想为各种规则类型保留相同的元素(规则)名称,那么您定义的抽象元素(属性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>