Создание схемы xsd для следующего xml - PullRequest
0 голосов
/ 01 августа 2011

У меня есть следующий 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 ]

2 голосов
/ 01 августа 2011

Если вы хотите сохранить одно и то же имя элемента (правила) для различных типов правил, вы определили абстрактный элемент (атрибут abstract="true"), и у всех его потомков будет xs:ComplextContent>xs:extension с базовым атрибутом, равным вашему имени абстрактного типа,В вашем XML каждый элемент правила должен иметь атрибут xsi:type, чтобы различать конкретный тип элемента.Объяснение и пример: здесь .

Если вы хотите / можете использовать разные имена элементов для каждого типа правила, вы можете использовать группы подстановки.Ваш общий предок снова определяется атрибутом abstract.Конкретные типы определяются как xs: element с атрибутом substitutionGroup, равным имени общего предка.Объяснение и пример здесь .

0 голосов
/ 01 августа 2011

вы используете 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>

1011 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...