Question

Voici l'exemple xml qui a plusieurs <rulex> qui commence par la séquence 1 et il peut finir à beaucoup comme règle <rule1> , <rule2>, <rule3> etc ....

<?xml version="1.0" encoding="UTF-8"?>
<AddressChange_181>
    <rules>
        <rule1>
            <conditions>xya</conditions>
            <response_path>abc</response_path>
        </rule1>
        <rule2>
            <conditions>xxxx</conditions>
            <response_path>aaaa</response_path>
        </rule2>
        <rule3>
            <conditions>yyyyy</conditions>
            <response_path>ffff</response_path>
        </rule3>
        <rule4>
            <conditions>zzzz</conditions>
            <response_path>yyyy</response_path>
        </rule4>
        <default>
            <response_path>uuuuu</response_path>
        </default>
    </rules>
</AddressChange_181>

Voici le schéma où j'ai essayé de créer le nom de l'élément <rulex> dynamique pour le xml ci-dessus. quand je produis xml à partir de ce schéma je ne suis pas le même format xml comme ci-dessus xml. pouvez-vous s'il vous plaît laissez-moi savoir comment créer le schéma avec de multiples nom de l'élément qui commence par un numéro de séquence. Mon exigence est d'ajouter plus d'une règle (<rule1>,<rule2>,<rule3> etc ...) dans le fichier xml et ce fichier xml doit être validé par rapport au schéma.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="mock_rule_list"> 
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="rules" minOccurs="1" maxOccurs="1"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="rules">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="rule" minOccurs="0" maxOccurs="unbounded"/>        
        <xs:element ref="default" maxOccurs="1"/>
      </xs:sequence>
    </xs:complexType>   
  </xs:element>

  <xs:element name="rule">    
    <xs:complexType>  
    <xs:simpleContent>
      <xs:restriction base="xs:anyType">
        <xs:pattern value="rule/d{1,3}"></xs:pattern>
      </xs:restriction>
    </xs:simpleContent>      
      <xs:sequence>
        <xs:element ref="conditions" minOccurs="1" maxOccurs="1"/>
        <xs:element ref="response_path" minOccurs="1" maxOccurs="1"/>
      </xs:sequence>
    </xs:complexType>   

  </xs:element>

  <xs:element name="default">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="response_path"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="conditions" type="xs:string">   
  </xs:element>
  <xs:element name="response_path" type="xs:string"/>
</xs:schema>

Merci, Madhu

Était-ce utile?

La solution

Il n'y a pas moyen de définir une telle structure à l'aide XSD si le nombre de balises Rulex est définie arbitrairement. Si vous pouvez limiter la borne supérieure à un maximum, et vous devez vraiment rester avec convention de nommage Rulex, que vous pouvez définir un type complexe tel que RuleType, puis un tas de règle1, règle2, ..., éléments règleN de ce type -. Je qualifierais ce désordre ... Je ne recommanderais pas cet

XSD (avec un maximum de 6):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="mock_rule_list">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="rules" minOccurs="1" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="rules">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="rule1" minOccurs="0"/>
                <xs:element ref="rule2" minOccurs="0"/>
                <xs:element ref="rule3" minOccurs="0"/>
                <xs:element ref="rule4" minOccurs="0"/>
                <xs:element ref="rule5" minOccurs="0"/>
                <xs:element ref="rule6" minOccurs="0"/>
                <xs:element ref="default"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


    <xs:complexType name="ruleType">
        <xs:sequence>
            <xs:element ref="conditions" minOccurs="1" maxOccurs="1"/>
            <xs:element ref="response_path" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="default">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="response_path"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="conditions" type="xs:string">
    </xs:element>
    <xs:element name="response_path" type="xs:string"/>

    <xs:element name="rule1" type="ruleType"/>
    <xs:element name="rule2" type="ruleType"/>
    <xs:element name="rule3" type="ruleType"/>
    <xs:element name="rule4" type="ruleType"/>
    <xs:element name="rule5" type="ruleType"/>
    <xs:element name="rule6" type="ruleType"/>
</xs:schema>

Vous pourriez avoir une balise nommée « règle » avec un attribut @sequence.

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="mock_rule_list">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="rules" minOccurs="1" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="rules">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="rule" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="default"/>
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="SequenceKey">
            <xs:selector xpath="rule"/>
            <xs:field xpath="@sequence"/>
        </xs:unique>
    </xs:element>

    <xs:complexType name="ruleType">
        <xs:sequence>
            <xs:element ref="conditions" minOccurs="1" maxOccurs="1"/>
            <xs:element ref="response_path" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
        <xs:attribute name="sequence" type="xs:int" use="required"/>
    </xs:complexType>

    <xs:element name="default">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="response_path"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="conditions" type="xs:string">
    </xs:element>
    <xs:element name="response_path" type="xs:string"/>

    <xs:element name="rule" type="ruleType"/>
</xs:schema>

XML Exemple:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<rules xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <rule sequence="1">
        <conditions>conditions1</conditions>
        <response_path>response_path1</response_path>
    </rule>
    <rule sequence="2">
        <conditions>conditions2</conditions>
        <response_path>response_path2</response_path>
    </rule>
    <default>
        <response_path>response_path1</response_path>
    </default>
</rules>

Ou il se pourrait aussi que l'on pourrait simplement utiliser l'index de la dans la collection parent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top