PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [XSD] Beziehungen validieren


xml_kack_noob
2011-12-11, 17:12:13
Hi,
ich nehme mal folgendes als Beispiel:
<person>
<name>xyz</name>
<isMarried>false</isMarried>
</person>

Sollte diese Person aber nun verheiratet sein, so muss sie auch den Partner angeben:
<person>
<name>xyz</name>
<isMarried>true</isMarried>
<parner>abc</partner>
</person>

Ich habe also drei Elemente:
- Der name der zwingend angegeben werden muss,
- ein optionales Element isMarried, welches den default wert false hat,
- ein partner Element, das optional ist wenn isMarried=false. Sollte isMarried=true sein, so muss dieses Element vorhanden sein.


Gelesen werden die Daten mittels Java und JAXB. Ich würde hierbei gern die Möglichkeit nutzen, die Dokumente gleich beim unmarshal Prozess mittels einer XSD zu validieren. Nun bin ich mir nicht sicher, ob ich die o.g. Beziehung ebenfalls über ein Schema validieren kann.

Ist dies möglich, oder muss ich das im Code machen?


Gruß

Monger
2011-12-11, 18:59:43
Bei Elementen die genau Null bis Einmal vorkommen können und die keinen komplexen Typus darstellen, sollte man drüber nachdenken ob man sie nicht lieber als Attribute modellieren will:

<Person Name=xyz IsMarried=False Partner=abc />

Parameter kannst du in xsd nämlich auch als optional oder mandatory kennzeichnen. Du kannst für Unterknoten aber auch untere und obere Grenzen angeben, so dass halt z.B. maximal drei Unterknoten für Partner erlaubt sind (Special Edition für Mormonen).

Ob du solche komplexen Abhängigkeiten innerhalb von XSD formulieren kannst, dass also Knoten X nur erlaubt ist wenn Knoten Y bereits da ist... bin ich überfragt.
Ich vermute, dass du das in der Programmlogik tun musst. XSD ist wohl erstmal nur dazu gedacht, um zu schauen ob du einen gültigen Datencontainer vor dir hast - aber nicht um zu bestimmen ob der Inhalt auch Sinn macht.

PatkIllA
2011-12-11, 21:44:52
Man kann mit key und keyref Abhängigkeiten definieren.

Monger
2011-12-11, 21:55:32
Man kann mit key und keyref Abhängigkeiten definieren.
Ja, aber keine Bedingungen - zumindest soweit ich weiß.

PatkIllA
2011-12-11, 21:59:27
Ja, aber keine Bedingungen - zumindest soweit ich weiß.
Das isMarried is eigentlich eh über.
Ich würde auch einfach auf ein optionales Attribute partner gehen.
Oder noch eher auf einen extra Abschnitt mit den Beziehungen, da man den Partner ja auf beiden Seiten angebn müsste.

xml_kack_noob
2011-12-12, 01:02:29
Na, das oben ist nur ein vereinfachtes Beispiel... Wobei ich nun befürchte, dass ich auch einfach ein Design fehler gemacht habe.

Hier das konkrete Problem:

...
<protocol type="btlp | ltep | azmp">
<clientName ltep="abc" azmp="def" isEncodingDisabled="false" />
<clientVersion azmp="xyz" />
<reservedBits>...</reservedBits>
</protocol>
...


- protocol.type kann nur eines dieser Werte haben: btlp, ltep oder azmp
- protocol.clientName ist für type="btlp" optional, für die beiden anderen Typen aber pflicht.
- clientName.ltep ist Pflicht.
- clientName.azmp ist für type="ltep" optional, aber für type="azmp" Pflicht.
- clientName.isEncodingDisabled ist optional.
- protocol.clientVersion ist nur für type="azmp" Pflicht, für die beiden anderen Typen aber optional
- protocol.reservedBits ist für alle Pflicht

Kann man sowas mittels XSD validieren?

Gast
2011-12-12, 09:35:23
Schau mal bezüglich Constraints bei XSD

http://www.datypic.com/books/defxmlschema/chapter17.html <- Das ist ein Beispiel, bei dem geprüft wird, ob der Inhalt eines Kindknotens auf ein existierendes Element verweist. Das könnte man womöglich auf dein Vorhaben adaptieren.

xml_kack_noob
2011-12-13, 15:09:13
Okay, nachdem ich nun ein paar Stunden rumprobiert habe und es doch nicht geschafft hab, bin ich auf die Code-Lösung umgestiegen. [Was übrigends das Problem in 10 Min. gelöst hat ;-)]

Gruß