Avatar billede amoelle Nybegynder
29. april 2003 - 09:55 Der er 2 kommentarer og
1 løsning

hvem kan knække en XSD/XML nød !

Hej,
jeg er ved at lave et skema, der skal bruges til validering af nogle XML filer, men kan kun få det til at virke, når jeg bruger en ret uelegant løsning (se allernederst).

Mon der er nogen, der kan komme op med noget mere elegant/generelt ?
(gerne en slags rekursion i definitionen, selvom man jo ikke kan bruge cirkulære referencer til <xs:group>)

**********************************
Problemstillingen er barberet ned til følgende:

Der KAN forekomme 3 elementtyper E1, E2 og E3 i XML filen
Der SKAL findes mindst een af elementtyperne E1, E2 eller E3 i XML filen
Elementtype E1 MÅ forekomme med multiple forekomster (hvis den forekommer)
Elementtype E2 og E3 MÅ KUN forekomme een gang (hvis de forekommer)
**********************************
Jeg har problemer med at bruge <xs:choice>, da den jo plukker netop een ud af en række alternativer,og der er brug for een eller flere

Svært at lave rekursion, idet cirkulære referencer i <xs:group> ikke er tilladt

Nedenfor ses en række XML-filer, der skal henholdsvis accepteres af XSD'en og efterfølgende en række XML-filer, der ikke må blive accepteret.

Allernederst ses en XSD, der virker. Den er bare meget uelegant, når problemstillingen udvides til 10 elementtyper E1, E2,...,E10.
Så får jeg jo 10 grupper med hver 10 elementreferencer.

på forhånd tak


************ACCEPT**************
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E1>Text</E1>
        <E2>ttt</E2>
        <E3>trt</E3>
    </Type>
</ROD>

<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E1>Text</E1>
        <E1>Text</E1>
        <E2>ttt</E2>
        <E3>trt</E3>
    </Type>
</ROD>
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E1>Text</E1>
        <E1>Text</E1>
    </Type>
</ROD>

<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E1>Text</E1>
        <E1>Text</E1>
        <E3>trt</E3>
    </Type>
</ROD>

<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E2>ttt</E2>
        <E3>trt</E3>
    </Type>
</ROD>

<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E2>ttt</E2>
    </Type>
</ROD>

************EJ ACCEPT**************
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
    </Type>
</ROD>


<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E1>Text</E1>
        <E2>ttt</E2>
        <E2>ttt</E2>
        <E3>trt</E3>
    </Type>
</ROD>


<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E2>ttt</E2>
        <E2>ttt</E2>
    </Type>
</ROD>


*************virker************
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:group name="G1">
        <xs:sequence>
            <xs:element ref="E1" maxOccurs="unbounded"/>
            <xs:sequence minOccurs="0">
                <xs:element ref="E2" minOccurs="0"/>
            </xs:sequence>
            <xs:sequence minOccurs="0">
                <xs:element ref="E3" minOccurs="0"/>
            </xs:sequence>
        </xs:sequence>
    </xs:group>
    <xs:group name="G2">
        <xs:sequence>
            <xs:element ref="E1" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="E2"/>
            <xs:element ref="E3" minOccurs="0"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="G3">
        <xs:sequence>
            <xs:element ref="E1" minOccurs="0" maxOccurs="unbounded"/>
            <xs:sequence minOccurs="0">
                <xs:element ref="E2" minOccurs="0"/>
            </xs:sequence>
            <xs:element ref="E3"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="endG"/>
    <xs:element name="ROD">
        <xs:complexType>
            <xs:all>
                <xs:element name="Type" nillable="false">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:choice>
                                <xs:group ref="G1"/>
                                <xs:group ref="G2"/>
                                <xs:group ref="G3"/>
                            </xs:choice>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
    <xs:element name="E1"/>
    <xs:element name="E2"/>
    <xs:element name="E3"/>
</xs:schema>

***********************************************************
Avatar billede roe Nybegynder
02. juni 2003 - 10:12 #1
Dette burde hjælpe til det du ønsker:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ROD">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Type" type="xar"/>
            </xs:sequence>
        </xs:complexType>
</xs:element>   

<xs:complexType name="xar">
    <xs:sequence>
      <xs:choice>
            <xs:element ref="E1"/>
            <xs:element ref="E2"/>   
            <xs:element ref="E3"/>
      </xs:choice>
    <xs:element ref="E1" maxOccurs="unbounded" minOccurs="0"/>
        <xs:element ref="E2" maxOccurs="1" minOccurs="0"/>
        <xs:element ref="E3" maxOccurs="1" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="E1" type="xs:string"/>
<xs:element name="E2" type="xs:string"/>
<xs:element name="E3" type="xs:string"/>

</xs:schema>

Med venlig hilsen
roe
Avatar billede amoelle Nybegynder
13. juni 2003 - 13:39 #2
Hej roe,
desværre, det virker kun 'næsten'.
Kravet: Elementtype E2 og E3 MÅ KUN forekomme een gang (hvis de forekommer)
Dit forslag accepterer
<?xml version="1.0" encoding="UTF-8"?>
<ROD>
    <Type>
        <E2>ttt</E2>
        <E2>ttt</E2>
    </Type>
</ROD>

Alle andre test eksempler accepteres/ej accepteres som de skal

med venlig hilsen
amoelle
Avatar billede amoelle Nybegynder
30. marts 2005 - 10:58 #3
problemstillingen er forældet og lukkes
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester