Frage

Unten finden Sie das Beispiel XML mit mehreren <rulex> Das beginnt mit Sequenz 1 und kann vielen regieren wie <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>

Unten ist das Schema, in dem ich versucht habe, dynamisch zu erstellen <rulex> Elementname für das obige XML. Wenn ich XML aus diesem Schema generiere, erhalte ich nicht das gleiche XML -Format wie oben XML. Können Sie mir bitte wissen, wie Sie ein Schema mit mehreren Elementnamen erstellen, der mit einer Sequenznummer beginnt? Meine Anforderung ist es, mehr als eine Regel hinzuzufügen (<rule1>,<rule2>,<rule3> etc ...) in der XML -Datei und diese XML -Datei sollte gegen Schema validiert werden.

<?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>

Danke, Madhu

War es hilfreich?

Lösung

Es gibt keine Möglichkeit, eine solche Struktur unter Verwendung von XSD zu definieren, wenn die Anzahl der Rulex -Tags willkürlich definiert ist. Wenn Sie die Obergrenze auf ein Maximum beschränken können und sich wirklich bei der Rulex -Namenskonvention halten müssen, können Sie einen komplexen Typ wie Ruletype definieren, dann eine Reihe von Regel1, Regel2, ..., Relumelemente dieser Art - Ich würde das chaotisch nennen ... Ich würde das nicht empfehlen.

Xsd (mit maximal 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>

Alternativ können Sie ein Tag mit dem Namen "Regel" mit einem @sequence -Attribut haben.

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>

Beispiel XML:

<?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>

Oder es könnte auch sein, dass man einfach den Index der verwenden könnteu003Crule/> Innerhalb der Elternsammlung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top