2016-04-30 14 views
1

Ich versuche, eine XSD für die folgende XML zu erstellen, und ich JAXB verwenden, um Java-Objekt mit Validierung entpacken.Wie wird ein Element basierend auf einem 'type' Attributwert benötigt?

Die Validierungsregel besteht darin, dass die ersten 2 Elemente in , die type = jobType und type = customer sind, erforderlich sind. Alle anderen innerhalb JobParam sind optional.

Wie erstelle ich eine XSD dafür?

<job> 
    <jobName>core</jobName> 
    <jobParams> 
     <jobParam type="jobType">Scheduler</jobParam> 
     <jobParam type="customer">Alphabet</jobParam> 
     <jobParam type="mode">music</jobParam> 
     </jobParams> 
</job> 

Antwort

1

Sie können Ihre Validierungsregel nicht in XSD 1.0 ausdrücken. Sie müssten dies in Java für Ihre JAXB-erstellten Objekte tun oder zu XSD 1.1 wechseln, wo Sie Assertionen oder eine bedingte Typzuweisung verwenden könnten.

jedoch die beste Lösung wäre, um Ihr XML-Design zu beheben:

  • Es gibt keine Notwendigkeit, die Eltern-Namen in den Namen der Kinder zu wiederholen. [minor]
  • Wenn Elementtypen ein Teil des Namens und nicht ein Attributwert sind, können einfache XSD 1.0-Vorkommensbedingungen zur Darstellung Ihrer Validierungsregel verwendet werden. [Haupt]

Hier sind die oben genannten Verbesserungen zu Ihrer XML gemacht:

<job> 
    <name>core</name> 
    <params> 
     <type>Scheduler</type> 
     <customer>Alphabet</customer> 
     <mode>music</mode> 
    </params> 
</job> 

Zwei weitere Verbesserungen sollten Sie überlegen:

  1. Drop the params Wrapper, die Förderung ihrer Kinder zu seien Sie Kinder von job.
  2. Fügen Sie einen customParams Wrapper hinzu, wenn Sie wirklich Parameter unterstützen müssen, die bei der XSD-Entwurfszeit nicht bekannt sind.

Zum Beispiel:

<job> 
    <name>core</name> 
    <type>Scheduler</type> 
    <customer>Alphabet</customer> 
    <customParams> 
     <customParam type="mode">music</customParam> 
    </customParams> 
</job> 

Dies kann trivialerweise zusammen mit Ihrer Gültigkeitsregel customer und mode über grundlegende Auftreten Einschränkungen in XSD 1.0 in Bezug auf dargestellt werden.

+0

Danke. Ich wünschte, ich könnte das XML ändern und ich stimme Ihrem Vorschlag zu. Aber das ist zur Zeit nicht möglich. Die Clientbenutzer dieser XML-Datei sind nicht bereit, sie zu aktualisieren. Heute behandle ich diese Validierung für Java-Objekte. Jedoch können nicht alle Fälle effektiv mit Java-Code behandelt werden. Wenn die XML-Datei beispielsweise doppelte JobParam-Elemente enthält Zeitplaner SAK

+0

Wenn Sie das XML nicht umgestalten können, sind Ihre Optionen ** (a) ** Verschieben nach XSD 1.1, ** (b) * * Erzwinge diese Einschränkung außerhalb von XSD (z. B. in Java) oder ** (c) ** setze die Einschränkung, dass 'jobParam [@ type =' jobType '] 'und' jobParam [@ type =' customer '] '' muss anwesend sein. XSD 1.0 kann diese Einschränkung angesichts des ursprünglichen XML-Entwurfs einfach nicht ausdrücken. Die in Ihrem Kommentar erwähnte zusätzliche Einschränkung ist ähnlich. (Weder sollte in Java schwer zu implementieren sein - es wäre einfach nicht ideal, um Validierungsbeschränkungen deklarativ im XSD zu zentralisieren.) – kjhughes