jaxb xsd schema, min/maxoccurs macht was?

alderwaran

Mitglied
hi zusammen,

ich habe ein problem der xsd-beschreibung eines xml, genauer der definition erlaubter wiederholungen von tags unterhalb eines vatertags.

ausschnitt:[XML] <xsd:element name="dokument">
<xsd:complexType>
<xsd:sequence minOccurs="1" maxOccurs="1">
<xsd:element name="styles" type="styles" minOccurs="1" maxOccurs="1"/>
<xsd:element name="head" type="head" minOccurs="1" maxOccurs="1"/>
<xsd:element name="zeitpunkt" type="zeitpunkt" minOccurs="1" maxOccurs="1"/>
<xsd:element name="angaben" type="angaben" minOccurs="1" maxOccurs="1"/>
<xsd:element name="fragen" type="fragen" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>[/XML]

<xsd:sequence minOccurs="1" maxOccurs="1"> sollte imho dazu führen das unterhalb des document-tags nur ein weiteres tag vorhanden sein darf, ist aber nicht der fall - es können alle tags von "styles" bis "fragen" vorkommen.
der xjc spuckt keine fehler aus sondern erzeugt brav alle klassen und der code ist soweit verwendbar - jedoch würde mich interressieren wie ich die anzahl der kind-tags beeinflussen kann, oder genauer wie min- und maxoccurs "die anzahl" von tags beeinflussen.
die sun jaxb docu hat mir nicht wirklich weiter geholfen... kennt sich hier jemand aus oder hat eine bessere docu zur hand?
 
G

gman

Gast
Hi,

du meinst also das in dem resultierenden XML nur entweder ein "styles" oder ein "head"
oder ein "zeitpunkt" oder ein "angaben" oder ein "fragen" stehen kann? Ich glaube über
min/maxOccurs kannst du das nicht abbilden. Bin mir auch nicht sicher ob man so ein
"Exklusiv-Oder" in XSD abbilden kann ???:L
 

Niki

Top Contributor
Ich bin mir nicht sicher, aber vielleicht klappt es so:
Java:
		<xsd:complexType>			
			<xsd:choice>
					<xsd:element name="Arbeiter" type="ma:ArbeiterType" />
					<xsd:element name="Angestellter" type="ma:AngestellterType" />
			</xsd:choice>			
		</xsd:complexType>

kann man hier nachlesen:
<xsd:choice>-Element
 
Zuletzt bearbeitet:

alderwaran

Mitglied
guter link, danke @niki

ich habe jetzt das xsd umgeändert und :)choice minOccurs="1" maxOccurs="1") verwendet. wenn ich das richtig verstanden habe darf nun nur ein bestimmtes objekt aus der liste auftauchen und das auch nur genau einmal.
[XML] <xsd:element name="dokument">
<xsd:complexType>
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="outputfield" type="outputfield" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<!-- -->
<xsd:complexType name="outputfield">
<xsd:choice minOccurs="1" maxOccurs="1">
<xsd:element name="hidden" type="hidden" minOccurs="1" maxOccurs="1"/>
<xsd:element name="styles" type="styles" minOccurs="1" maxOccurs="1"/>
<xsd:element name="headline" type="headline" minOccurs="1" maxOccurs="1"/>
<xsd:element name="zeitpunkt" type="zeitpunkt" minOccurs="1" maxOccurs="1"/>
<xsd:element name="angaben" type="angaben" minOccurs="1" maxOccurs="1"/>
<xsd:element name="fragen" type="fragen" minOccurs="1" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>[/XML]


ich hab dann testweise in ein xml einen fehler dahingehend eingebaut das verbotenerweise 2 elemente ("hidden" und "styles") in einem element "outputfield" auftauchen
[XML]<outputfield type="hidden">
<hidden>
<field key="document_id" value="1234567"/>
<field key="server_url" value="http://mikusch/insert_pdf_data.php"/>
<field key="database_procedure" value="testschema.checkprocedure"/>
<field key="document_type" value="technische_nachbetreuung"/>
<field key="document_type_version" value="1"/>
</hidden>
<styles>
<style name="normal" size="10" fgcol="000000" bgcol="ffffff" outline="false" align="left"/>
<style name="tablehead" size="10" fgcol="000000" bgcol="ffffff" outline="true" align="center"/>
<style name="überschrift1" size="20" fgcol="000000" bgcol="ffffff" outline="true" align="center"/>
<style name="überschrift2" size="16" fgcol="000000" bgcol="ffffff" outline="true" align="center"/>
<style name="überschrift3" size="14" fgcol="000000" bgcol="a0a0a0" outline="true" align="left"/>
<style name="überschrift4" size="12" fgcol="ffffff" bgcol="c0c0c0" outline="true" align="left"/>
<style name="überschrift5" size="12" fgcol="000000" bgcol="a0a0a0" outline="true" align="center"/>
<style name="frage_typ_0" size="10" fgcol="000000" bgcol="c0c0c0" outline="true" align="left"/>
<style name="Frage_typ_1" size="10" fgcol="000000" bgcol="ffffff" outline="true" align="left"/>
</styles>
</outputfield>[/XML]

und es testweise unmarshallen lassen um mir im debugger die jaxb objektstruktur anzuschauen

Java:
package jaxb_sequential_access_test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import v1.Dokument;
import v1.ObjectFactory;

public class Main {

    private static Object xmlObjects;

    public static void main(String[] args) {
        try {
            JAXBContext jc;
            jc = JAXBContext.newInstance(ObjectFactory.class);
            Unmarshaller um = jc.createUnmarshaller();
            xmlObjects = um.unmarshal(new FileInputStream("/home/xrr/NetBeansProjects/sax_test/src/jaxb_sequential_access_test/v1.xml"));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JAXBException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        Dokument DocumentObject = Dokument.class.cast(xmlObjects);
        System.out.println("test");
    }
}

jetzt bin ich verwirrt denn die objekte für "hidden" und "styles" werden anstandslos eingelesen und in die objektstruktur gepresst *obwohl* das laut xsd ja nicht gehen sollte. wird da keine prüfung vorgenommen oder hab ich noch was vergessen/falsch gemacht?

und noch eine frage am rande:
xsd-element min/maxOccurs sagt aus wie tief die verschachtelungstiefe eines elements in sich selbst sein darf? also
[XML]<element>
<element>
<element>
.......[/XML]
bedeutet dann 0 keine unterelemente?
 
G

gman

Gast
Hmm,

probier mal aus dem choice-Block die "type"-Attribute von den Elementen wegzulassen. Denn die
resultierende XML-Datei hat ja nur "type=hidden". Vielleicht greift dann die Regel, das nur ein
Unterelement vorhanden sein darf.
 
P

passant

Gast
und noch eine frage am rande:
xsd-element min/maxOccurs sagt aus wie tief die verschachtelungstiefe eines elements in sich selbst sein darf? also
[XML]<element>
<element>
<element>
.......[/XML]
bedeutet dann 0 keine unterelemente?

Nein, min- und maxOccurs bezieht sich nicht auf Unterknoten, sondern definiert, wie oft dieses Element unter seinem Elternknoten vorhanden sein muß, bzw. auftauchen darf - und zwar genau auf dieser Ebene, nicht irgendwo weiter verschachtelt.
 

Ähnliche Java Themen

Neue Themen


Oben