Forum: PC-Programmierung [XSD] xml schema frage: Referenzen


von Vlad T. (vlad_tepesch)


Lesenswert?

Hi,
Ich habe XML in folgender Struktur:
1
<test>
2
  <types>
3
    <type name="A">
4
      <port name="pa1" />
5
      <port name="pa2" />
6
      <port name="pa3" />
7
    </type>
8
    <type name="B">
9
      <port name="pb1" />
10
      <port name="pb2" />
11
      <port name="pb3" />
12
    </type>
13
  </types>
14
  
15
  <instances>
16
    <instance name="a1" type="A" />
17
    <instance name="a2" type="A" />
18
    <instance name="b1" type="B" />
19
    <instance name="b2" type="B" />
20
  </instances>
21
  <connections>
22
    <connect from="a1" fromPort="pa1"  to="b1" toPort="pb3" />
23
  </connections>
24
</test>

kann ich im Schema irgendwie sicherstellen, dass im connect valide 
Referenzen stehen?
Es sit kein Problem sicherzustellen, dass from und to auf korrekte 
Instanzen schauen.
Es ist auch kein Problem festzustellen, ob es überhaupt einen Portnamen 
"pa1" gibt. Aber kann ich auch validieren, dass der unter from 
referenzierte Typ einen Port hat, wie in fromPort referenziert?


das schema ist nicht fix. denkbar wäre auch folgendes:
1
  <instances>
2
    <instance name="a1" type="A" >
3
      <connect port="pa1"  to="b1" toPort="pb3" />
4
    </instance>
5
    <!-- [...] -->
6
  </instances>
Aber auch hier wüsste ich nicht wie.

Instanzen in die Typen zu bringen ist nicht drin.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Was immer geht ist eine "einfache" Prüfung über ref ID:
http://books.xmlschemata.org/relaxng/ch19-77159.html
Das stellt aber nur sicher, das eine gültige ID drinnsteht.

Will man "mehr" geht das über key/keyref
http://www.w3schools.com/schema/el_keyref.asp
http://msdn.microsoft.com/de-de/library/ms256101(v=vs.80).aspx
http://msdn.microsoft.com/de-de/library/ms256478(v=vs.80).aspx

da ist nur das Problem, das viele Validatoren das nicht unterstützen.

von Vlad T. (vlad_tepesch)


Lesenswert?

Läubi .. schrieb:
> Will man "mehr" geht das über key/keyref

über die existenz von keyrefs bin ich mir im klaren, nur weiß ich nicht, 
wie man das damit umsetzen soll.

Vlad Tepesch schrieb:
> Es sit kein Problem sicherzustellen, dass from und to auf korrekte
> Instanzen schauen.
> Es ist auch kein Problem festzustellen, ob es überhaupt einen Portnamen
> "pa1" gibt. Aber kann ich auch validieren, dass der unter from
> referenzierte Typ einen Port hat, wie in fromPort referenziert?
dies beides ist mit key/kexref kein Problem, aber wie soll man eine 
abfrage formulieren, dass die Prüfung auf Existenz des Unterelementes im 
durch from-Attribut spezifiziertem Element beschränkt wird.

der selctor müsste ja igendwie so aussehen:
1
<xs:element name="connect">
2
  <xs:complexType>
3
    <xs:attribute name="from"     type="xs:string"/>
4
    <xs:attribute name="fromPort" type="xs:string"/>
5
    <xs:attribute name="to"       type="xs:string"/>
6
    <xs:attribute name="toPort"   type="xs:string"/>
7
8
    <xs:keyref name="connectionFromPortRef" refer="connectionFromPort">
9
      <xs:selector xpath="."/>
10
      <xs:field    xpath="@fromPort"/>
11
    </xs:keyref>
12
    <xs:key name="connectionFromPort">
13
      <xs:selector xpath="//types/type[@name=<<<<<<<<<<<hier liegt das Problem>>>>>>>>>>>>>]/port"/>
14
      <xs:field    xpath="@name"/>
15
    </xs:key>
16
  </xs:complexType>
17
</xs:element>
<<<<<<<<<<<hier liegt das Problem>>>>>>>>>>>>>
an dieser stelle müsste ermittelt werden, was für ein Typ das im Feld 
from referenzierte Objekt hat.
müsste ja auf das Attribut.

im 2. Beispiel (schmema-Alternative) wäre es eine Dereferenzierung 
weniger, weil man den Typ direkt ermitteln kann. Das grundsätzliche 
Problem besteht aber.

geht das irgendwie im selector?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Puh, also wenn ich das richtig verstanden habe willst du zwei Attribute 
matchen.

Ich fürchte da ist man bei dem Punkt wo man mit einer simplen 
Validierung des XML allein nicht weiterkommt (mir fällt zumindest 
spontan nichts ein), da dur hier gewissermaßen auf die konkrete 
Elementinstanz matchen müsstest, solange diese aber sich selbst nicht 
einschränken lässt wird das schwer.

Spricht den etwas dagegen das einfach in der Applikation zu prüfen? Was 
mir sonst für Inhaltliche Prüfungen noch einfällt wäre Schematron:
http://de.wikipedia.org/wiki/Schematron
da kann man verschiedene Rules definieren, das geht dann aber halt nicht 
allein mit einem XSD Validator, Schematron aknn man z.B. in die 
<appinfo> Elemente eines XSD einbinden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.