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.10. XSD complexType Definities - choice en group

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.10.1. Choice

Om een keuze te laten tussen verschillende childelementen kan men gebruik maken van een choice.

Zo zal volgend schema voor een factuur de mogelijkheid geven om een apart facturatie-adres en leveringsadres op te geven ofwel één adres (voor beide) te gebruiken :
XML Schema Definition
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="invoice">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="ID" type="xsd:string" />
        <xsd:choice>
          <xsd:element name="singleAddress" type="address" />
          <xsd:sequence>
            <xsd:element name="invoiceAddress" type="address" />
            <xsd:element name="deliveryAddress" type="address" />
          </xsd:sequence>
        </xsd:choice>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="address">
    <xsd:sequence>
      <xsd:element name="NumberAndStreet" type="xsd:string" />
      <xsd:element name="CityAndZip" type="xsd:string" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
Conform dit schema zijn volgende XML documenten :
XML Instantie
<?xml version="1.0" encoding="utf-8"?>
<invoice>
  <ID>101</ID>
  <singleAddress>
    <NumberAndStreet>15, Parklane</NumberAndStreet>
    <CityAndZip>90210 Beverly Hills</CityAndZip>
  </singleAddress>
</invoice>
XML Instantie
<?xml version="1.0" encoding="utf-8"?>
<invoice>
  <ID>102</ID>
  <invoiceAddress>
    <NumberAndStreet>15, Parklane</NumberAndStreet>
    <CityAndZip>90210 Beverly Hills</CityAndZip>
  </invoiceAddress>
  <deliveryAddress>
    <NumberAndStreet>436, Venice Avenue</NumberAndStreet>
    <CityAndZip>90210 Beverly Hills</CityAndZip>
  </deliveryAddress>
</invoice>
Volgend XML document is dan weer niet conform dit schema gezien er enkel een invoiceAddress en geen deliveryAddress is opgegeven :
XML Instantie
<?xml version="1.0" encoding="utf-8"?>
<invoice>
  <ID>103</ID>
  <invoiceAddress>
    <NumberAndStreet>15, Parklane</NumberAndStreet>
    <CityAndZip>90210 Beverly Hills</CityAndZip>
  </invoiceAddress>
</invoice>
Dit is opzich eerder een fout tegen de sequence die bepaald dat hier een invoiceAddress moet gevolgd worden door een deliveryAddress.

Wel fout tegen de choice zou volgend XML document zijn, waar beide opties zijn opgenomen, en er dus geen keuze is gemaakt :
XML Instantie
<?xml version="1.0" encoding="utf-8"?>
<invoice>
  <ID>104</ID>
  <singleAddress>
    <NumberAndStreet>15, Parklane</NumberAndStreet>
    <CityAndZip>90210 Beverly Hills</CityAndZip>
  </singleAddress>
  <invoiceAddress>
    <NumberAndStreet>15, Parklane</NumberAndStreet>
    <CityAndZip>90210 Beverly Hills</CityAndZip>
  </invoiceAddress>
  <deliveryAddress>
    <NumberAndStreet>436, Venice Avenue</NumberAndStreet>
    <CityAndZip>90210 Beverly Hills</CityAndZip>
  </deliveryAddress>
</invoice>
Het hiervoor vermelde schema liet de keuze uit twee opties.  Meer dan twee opties in een choice is uiteraard ook mogelijk.

30.10.2. Group

Hetzelfde data model als het hiervoor vermelde schema kunnen we ook als volgt formuleren :
XML Schema Definition
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="invoice">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="ID" type="xsd:string" />
        <xsd:choice>
          <xsd:element name="singleAddress" type="address" />
          <xsd:group ref="twoAddresses" />
        </xsd:choice>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:group name="twoAddresses">
    <xsd:sequence>
      <xsd:element name="invoiceAddress" type="address" />
      <xsd:element name="deliveryAddress" type="address" />
    </xsd:sequence>
  </xsd:group>
  <xsd:complexType name="address">
    <xsd:sequence>
      <xsd:element name="NumberAndStreet" type="xsd:string" />
      <xsd:element name="CityAndZip" type="xsd:string" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>
Bemerk hoe een <xsd:group> node nu is opgenomen in de choice om te verwijzen (via het ref attribuut) naar een elementengroep waarvan de definitie onder het complex type is opgenomen.
Deze group definitie bevat dezelfde sequence als ons vorig schema.

Het nut van dergelijke groupen is meteen duidelijk, het kan een XML schema beter structureren, en - indien wenselijk - kan men nu op meerdere plaatsen naar deze group verwijzen.

Een group definitie kan geen andere group definitie bevatten, maar kan wel verwijzingen naar een andere group.

30.10.3. minOccurs en maxOccurs Attributen

Zowel aan <xsd:sequence>, <xsd:all>, <xsd:choice> als <xsd:group> nodes kan men de attributen minOccurs en maxOccurs toevoegen.
By default staan beide attributen op "1", maar indien deze optioneel zijn of meermaals mogen voorkomen, kan men deze attributen ook op een andere waarde instellen.

Zo zal volgend schema voor library elementen meerdere book of comicBook childelementen kunnen bevatten :
XML Schema Definition
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="library">
    <xsd:complexType>
      <xsd:choice maxOccurs="unbounded">
        <xsd:element name="book" />
        <xsd:element name="comicBook" />
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
Conform met dit schema is volgend XML document :
XML Instantie
<?xml version="1.0" encoding="utf-8"?>
<library>
  <book></book>
  <comicBook></comicBook>
  <book></book>
</library>
Niet conform, omdat er nog altijd minimaal één keuze moet gemaakt worden (default minOccurs="1"), is volgend XML document :
XML Instantie
<?xml version="1.0" encoding="utf-8"?>
<library />

30.10.4. anyType

Het is je misschien opgevallen hoe in het hiervoor vermelde schema geen type attribuut is opgenomen bij de childelementen.

Indien men deze achterwege laat dan zijn deze van het default type xsd:anyType.
Hierbij is geen enkele beperking van toepassing op de inhoud van deze elementen, de inhoud kan met andere woorden eender wat zijn.

Volgend scheme is dan ook identiek aan het vorige schema :
XML Schema Definition
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="library">
    <xsd:complexType>
      <xsd:choice maxOccurs="unbounded">
        <xsd:element name="book" type="xsd:anyType" />
        <xsd:element name="comicBook" type="xsd:anyType" />
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
Deze keer werd expliciet in het type attribuut verwezen naar xsd:anyType.

De inhoud van een xsd:anyType element kan bijvoorbeeld ook bestaan uit andere childelementen.
Volgend XML document is dan ook conform dit schema :
XML Instantie
<?xml version="1.0" encoding="utf-8"?>
<library>
  <book>
    <author></author>
  </book>
</library>

30.10.5. AttributeGroup

Ook attributen kan men groeperen, dit kan aan de hand van een attributeGroup :
XML Schema Definition
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="employee">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="name" type="xsd:string" />
      </xsd:sequence>
      <xsd:attributeGroup ref="id" />
    </xsd:complexType>
  </xsd:element>
  <xsd:attributeGroup name="id">
    <xsd:attribute name="ID" type="xsd:string" />
    <xsd:attribute name="departement">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="sales" />
          <xsd:enumeration value="marketing" />
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>
  </xsd:attributeGroup>
</xsd:schema>
Conform dit schema is volgend XML document :
XML Instantie
<?xml version="1.0" encoding="utf-8"?>
<employee ID="01" departement="sales">
  <name>John</name>
</employee>
Opnieuw kan dit de leesbaarheid en de aanpasbaarheid van het schema ten goede komen.  Het is hiermee ook mogelijk om in meerdere elementen naar deze attributeGroup te verwijzen.
Ook een attributeGroup kan naar andere attributeGroups verwijzen.

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