为以下xml创建xsd架构

时间:2011-08-01 16:22:25

标签: c# .net xml xsd

我有以下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个不同的规则类型。

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

2 个答案:

答案 0 :(得分:2)

如果要为各种规则类型保留相同的元素名称(规则),则定义了抽象元素(属性abstract="true"),并且其所有子元素都将具有xs:ComplextContent>xs:extension,其基本属性等于你的抽象类型名称。 在XML中,每个规则元素必须具有xsi:type attrite以区分元素具体类型。 解释和示例是here

如果您希望/可以为每种规则类型使用不同的元素名称,则可以使用替换组。您的共同祖先再次由属性abstract定义。具体类型定义为xs:元素,其属性substitutionGroup等于共同祖先的名称。 解释和示例是here

答案 1 :(得分:0)

你使用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>