Jag vill ha ett schema som ska beskriva data på följande format: Här är ett exempel: Ladda ner xmlspy från www.xmlspy.com . Det programmet har en skitbra schemamodelleringsfunktion. Och här är lite kod för att använda validera din xml mot schemat. Tackar för hjälpen. Har klarnat ganska mycket nu. det var lite klurigare helt klart... Jo jag försökte oxå bara lägga till en rockbands-typ men det blev som sagt cirkulär referens då. Och det räcker inte att bara ha en referens typ rockbands_id och sedan manuellt leta rätt på rätt rockband. Alltså mer som en traditionell tabell?Hur ser schemat ut?
<rockband name="tha rockers">
<person>
<förnamn>
nisse
</förnamn>
<efternamn>
hult
</efternamn>
</person>
<person>
<förnamn>
pippi
</förnamn>
<efternamn>
lågstrump
</efternamn>
</person>
</rockband>
+ flera band
allt detta lagrat i ett dataset
alltså vill kunna lagra många "rockband" som i sin tur har godtyckligt antal personer som medlemmar som varje har eget förnamn och efternamn
Hur skulle schemat se ut eller framförallt hur moddelerar jag i schema-designern?Sv: Hur ser schemat ut?
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="bands">
<xs:complexType>
<xs:sequence>
<xs:element name="rockband" type="rockband_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="rockband_type">
<xs:sequence>
<xs:element name="person" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="fornamn"/>
<xs:element name="efternamn"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="namn" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
Jag har gjort ett par ändringar. Ett rootelement som heter bands och som i sin tur innehåller rockband. (sen tog jag bort åäö)
det funkar för nedanstående xml
<?xml version="1.0" encoding="UTF-8"?>
<bands xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\schema_name_goes_here.xsd">
<rockband namn="tha rockers">
<person>
<fornamn>nisse</fornamn>
<efternamn>hult</efternamn>
</person>
<person>
<fornamn>pippi</fornamn>
<efternamn>lågstrump</efternamn>
</person>
</rockband>
</bands>Sv: Hur ser schemat ut?
/MartinSv: Hur ser schemat ut?
skicka in din xmlsträng och sökvägen till ditt schema. Om du har din xml på disk som en fil får du ändra i funktionen och använda xmlDoc.Load istället för xmlDoc.LoadXML
<code>
Public Sub xmlValidate(ByVal sXMLstring As String, ByVal sSchemaPath As String)
Dim xmlSchemaCash As XMLSchemaCache40
Dim xmlSchema As DOMDocument40
Dim xmlDoc As DOMDocument40
Set xmlSchemaCash = New XMLSchemaCache40
Set xmlDoc = New DOMDocument40
xmlSchemaCash.Add "", sSchemaPath
With xmlDoc
.async = False
.setProperty "NewParser", True
Set .schemas = xmlSchemaCash
.loadXML sXMLstring
End With
If xmlDoc.parseError.errorCode <> 0 Then
With xmlDoc.parseError
Err.Raise .errorCode, "xmlValidate", .reason
End With
End If
Set xmlDoc = Nothing
Set xmlSchema = Nothing
Set xmlSchemaCash = Nothing
End Function
</code>Sv: Hur ser schemat ut?
En fråga till bara:
Hur gör jag om jag vill lägga in att varje person KAN ha ett favoritband?
Alltså jag vill kunna referera och accessa en annan instans av rockbands-tabellen på en person.Sv: Hur ser schemat ut?
jag testade att lägga till ett element i rockbandstypen så att man har förnamn, efternamn och favoritband. Favoritbandet är av typen rockband_type, men då får man en cirkulärreferens som inte verkar vara tillåten. Man kan sätta ett attribut som heter derivedBy till restriction och då gick det lite bättre. Schemat blir dock inte så snyggt eftersom man inte återanvänder rockband_type utan "gör en kopia" av den.
Kolla själv här:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="bands">
<xs:complexType>
<xs:sequence>
<xs:element name="rockband" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:complexContent>
<xs:extension base="rockband_type"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="rockband_type">
<xs:sequence>
<xs:element name="person" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="fornamn"/>
<xs:element name="efternamn"/>
<xs:element name="favorite_band" minOccurs="0">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="rockband_type">
<xs:sequence>
<xs:element name="person" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="fornamn"/>
<xs:element name="efternamn"/>
<xs:element name="favorite_band" minOccurs="0">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="rockband_type"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="namn" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
Inte så trevligt.
Ett rockband kan ha ett favoritband som är ett rockband. Favoritbandet kan däremot inte ha en nivå till under sig.
Om det är någon som har en bättre lösning så säg gärna till.
/MartinSv: Hur ser schemat ut?
Strategin med att göra en kopia av bandet håller inte i min applikation (som självklart inte handlar om rockband men av sekretess-skäl tog jag det som först ploppade upp i skallen hihi)
Jag vill nämligen att om man ändrar i ett band så ska förstås de personer som har det aktuella bandet som favorit referera till uppdaterat data. Visserligen skulle man ju kunna loopa igenom alla poster och uppdatera kopior men det är ju inte speciellt vackert.
Hur göra?
Är väldigt tacksam för att du lägger ner en massa tid på mitt problem.Sv: Hur ser schemat ut?
/Martin