Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

30.14. Target Namespaces in XML Schemas

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

30.14.1. Target Namespaces

Een XML schema kan je bekijken als een vocabulair en grammatica voor elementen en attributen die tot een bepaalde namespace horen, ook de "target namespace" genoemd.  Deze target namespace is een URI en kan worden gedefinieerd in het targetNamespace attribuut van het schema element.

Door aan te geven in welke namespace een element of attribuut is gedefineerd, kan men ondubbelzinnig verwijzen naar een element of attribuut uit een bepaald schema/vocabulair/namespace.  Vergelijkbaar dus met de namespaces in onze Visual Basic code.
Ook voor schema validatie is vereist dat geweten is in welk schema een element of attribuut is gedefinieerd.

Een voorbeeld van een XSD :
XML Schema Definition
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:ms="urn:my-schema"
        targetNamespace="urn:my-schema"
        elementFormDefault="unqualified"
        attributeFormDefault="unqualified">
  <element name="employee"    type="ms:employee"/>
  <element name="departement" type="string"/>
  <complexType name="employee">
    <sequence>
      <element name="name"    type="ms:name"/>
      <element ref="ms:departement"/>
    </sequence>
    <attribute name="id"      type="string"/>
  </complexType>
  <complexType name="name">
    <sequence>
      <element name="sirName" type="string"/>
    </sequence>
  </complexType>
</schema>
We hebben in bovenstaand schema twee globale elementen (elementen gedeclareerd op <schema> niveau), namelijk employee en departement.  Er zijn ook drie lokale elementen en attributen, name, sirName en id.

Er is een default namespace ingesteld xmlns="http://www.w3.org/2001/XMLSchema" die van toepassing is voor alle ongekwalificeerde elementen of attributen ( elementen of attributen zonder prefix).
De elementen <schema>, <element>, <complexType>, <sequence>, <attribute>, attributen als name, type, ref en datatypes als string, worden met andere woorden gevalideerd als komende uit deze default namespace.

Het vocabulair dat bovenstaand schema zelf introduceert komt terecht in de target namespace "urn:my-schema".  Om op verkorte wijze naar deze namespace te kunnen verwijzen, wordt een prefix ms ge-associeerd met deze namespace.
De user defined types employee en name waar naartoe verwezen wordt in enkele type attributen komen niet uit de default namespace, maar uit de namespace met prefix ms, hier overigens ook meteen de target namespace.
Vandaar de verwijzingen ms:employee en ms:name.

De <schema> element attributen elementFormDefault en attributeFormDefault die je op "qualified" of "unqualified" kan instellen, geven aan of de lokale elementen en attributen van de XML instantie moeten kwalificeren in welke namespace deze zijn gedefinieerd.  By default staan deze attributen op "unqualified".  Het was in bovenstaand schema dus niet noodzakelijk om deze attributen expliciet op te nemen.
In plaats van op <schema> niveau deze instelling te doen, kan men dit overigens ook op niveau van het element of attribuut zelf doen via het form attribuut.

Een met bovenstaand schema conforme instantie :
XML Instantie
<?xml version="1.0"?>
<myn:employee xmlns:myn="urn:my-schema" id="123">
  <name>
    <sirName>Smith</sirName>
  </name>
  <myn:departement>sales</myn:departement>
</myn:employee>
In dit geval wordt de namespace "urn:my-schema" ge-associeerd met een prefix myn, dit aan de hand van xmlns:myn="urn:my-schema".  De URI voor dit xmlns attribuut moet corresponderen met de target namespace van het schema waarvan je de elementen en attributen op een valideerbare manier wenst te gebruiken.

De namespace zorgt er hier voor dat de elementen <name>, <sirName> en attribuut id gevalideerd worden als komende uit deze namespace.  Deze elementen en attribuut mogen dus ongekwalificeerd blijven.  Tenzij er in het schema elementFormDefault="qualified" of attributeFormDefault="qualified" had gestaan.
Dit is niet zo voor <employee> en <departement>, dit zijn globale elementen in het schema, en moeten bijgevolg gekwalificeerd worden.  We kunnen gebruik maken van de prefix myn om aan te geven in welke namespace deze elementen zijn gedefinieerd.

Elementen of attributen moeten dus altijd gekwalificeerd worden indien ze globaal zijn gedefinieerd of indien de attributen elementFormDefault, attributeFormDefault of form dit afdwingen.

Het kwalificeren van elementen of attributen kan door de namespace prefix voor de naam van het element of attribuut te plaatsen.  In het geval van elementen kan men deze ook kwalificeren door een default namespace te gebruiken in dit XML bestand, dit kan niet met attributen.

30.14.2. Andere Kwalificatie Vereisten voor Elementen of Attributen

Men kan van alle lokale elementen in een XML instantie afdwingen dat ze worden gekwalificeerd, hiervoor stellen we in het schema het attribuut elementFormDefault in op "qualified" :
XML Schema Definition
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:ms="urn:my-schema"
        targetNamespace="urn:my-schema"
        elementFormDefault="qualified"
        attributeFormDefault="unqualified">
  <element name="employee"    type="ms:employee"/>
  <element name="departement" type="string"/>
  <complexType name="employee">
    <sequence>
      <element name="name"    type="ms:name"/>
      <element ref="ms:departement"/>
    </sequence>
    <attribute name="id"      type="string"/>
  </complexType>
  <complexType name="name">
    <sequence>
      <element name="sirName" type="string"/>
    </sequence>
  </complexType>
</schema>
Voor de rest is niets gewijzigd aan dit schema.

Om conform te blijven aan dit schema moeten we de XML instantie aanpassen :
XML Instantie
<?xml version="1.0"?>
<myn:employee xmlns:myn="urn:my-schema" id="123">
  <myn:name>
    <myn:sirName>Smith</myn:sirName>
  </myn:name>
  <myn:departement>sales</myn:departement>
</myn:employee>
Ook de elementen <name> en <sirName> zijn nu gekwalificeerd door er hier een prefix aan toe te voegen : <myn:name> en <myn:sirName>.

We kunnen het onszelf ook eenvoudiger maken door de namespace waarnaartoe we nu aan de hand van de prefix verwijzen gewoon als defaultnamespace in te stellen :
XML Instantie
<?xml version="1.0"?>
<employee xmlns="urn:my-schema" id="123">
  <name>
    <sirName>Smith</sirName>
  </name>
  <departement>sales</departement>
</employee>
Alle prefixen myn: zijn nu verdwenen.

We kunnen in ons schema ook afdwingen dat de attributen gekwalificeerd worden, door het attribuut attributeFormDefault van het schema element op "qualified" in te stellen :
XML Schema Definition
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:ms="urn:my-schema"
        targetNamespace="urn:my-schema"
        elementFormDefault="unqualified"
        attributeFormDefault="qualified">
  <element name="employee"    type="ms:employee"/>
  <element name="departement" type="string"/>
  <complexType name="employee">
    <sequence>
      <element name="name"    type="ms:name"/>
      <element ref="ms:departement"/>
    </sequence>
    <attribute name="id"      type="string"/>
  </complexType>
  <complexType name="name">
    <sequence>
      <element name="sirName" type="string"/>
    </sequence>
  </complexType>
</schema>
Ook hier kunnen we nu het attribuut id uitbreiden met de prefix myn: om de XML instantie conform dit schema te houden :
XML Instantie
<?xml version="1.0"?>
<myn:employee xmlns:myn="urn:my-schema" myn:id="123">
  <name>
    <sirName>Smith</sirName>
  </name>
  <myn:departement>sales</myn:departement>
</myn:employee>
Tot nu toe hebben we de vereisten voor de kwalificering van alle lokale elementen of attributen aangepast.  We kunnen dit echter ook op individueel niveau doen aan de hand van een form attribuut in een element of attribute definitie.  We kunnen dit attribuut opnieuw instellen op "qualified" of "unqualified".

In volgend schema is aan element declaratie voor sirName het form attribuut toegevoegd :
XML Schema Definition
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:ms="urn:my-schema"
        targetNamespace="urn:my-schema"
        elementFormDefault="unqualified"
        attributeFormDefault="unqualified">
  <element name="employee"    type="ms:employee"/>
  <element name="departement" type="string"/>
  <complexType name="employee">
    <sequence>
      <element name="name"    type="ms:name"/>
      <element ref="ms:departement"/>
    </sequence>
    <attribute name="id"      type="string"/>
  </complexType>
  <complexType name="name">
    <sequence>
      <element name="sirName" type="string" form="qualified"/>
    </sequence>
  </complexType>
</schema>
Naast de globale elementen employee en departement, die altijd moeten gekwalificeerd worden als er geen defaultnamespace is ingesteld, moeten we in de XML instanties nu ook de sirName elementen kwalificeren :
XML Instantie
<?xml version="1.0"?>
<myn:employee xmlns:myn="urn:my-schema" id="123">
  <name>
    <myn:sirName>Smith</myn:sirName>
  </name>
  <myn:departement>sales</myn:departement>
</myn:employee>
De individuele instelling form="qualified" overschrijft voor sirName de algemene instelling elementFormDefault="unqualified".

Ook aan xsd:attribute elementen in een schema kunnen we dit form attribuut toevoegen.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.