Thema: Delphi delphi<->XML

Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#7

Re: delphi<->XML

  Alt 6. Nov 2005, 01:08
Wenn du XML Daten validieren will, halte ich selbstgeschriebenen Code für wenig sinnvoll. Dafür wurden doch XML Schema erfunden. (Suche einfach "XSD" bei W3C oder Google)

Damit lassen sich deine Daten beschreiben und du kannst sie so gegen das Schema prüfen lassen.
Ein Schema für die von dir "preisgegebene" Struktur könnte so aussehen:
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://Salem.net/SalemSchema.xsd"
           elementFormDefault="qualified"
           xmlns="http://Salem.net/SalemSchema.xsd"
           xmlns:mstns="http://Salem.net/SalemSchema.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="probanten">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="probant">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded"
                          name="attribut">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="beschreibung"
                                type="BeschreibungsTyp"
                                minOccurs="1"
                                maxOccurs="1" />

                    <xs:element name="def_wert"
                                type="DefWertTyp"
                                minOccurs="1"
                                maxOccurs="1" />
                  </xs:sequence>

                  <xs:attribute name="typ"
                                type="AttributTyp"
                                use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>

            <xs:attribute name="Id"
                          type="xs:integer"
                          use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  
  <xs:simpleType name="AttributTyp">
    <xs:restriction base="xs:string">
      <xs:enumeration value="nc" />
      <xs:enumeration value="andererTyp" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="DefWertTyp">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="BeschreibungsTyp">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Ort" />
      <xs:enumeration value="Telefon privat" />
      <xs:enumeration value="Telefon geschäftlich" />
      <xs:enumeration value="Mobil" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
Jeder Probant muss eine Id haben und jedes Attribut muss den richtigen Text in Typ sowie in beschreibung stehen haben. Außerdem muss ein Wert in def_wert stehen.

Wenn du deine Daten anders strukturierst, könnte man mehr Prüfungen durchführen (bei den bestehenden ist es etwas krampfartig, def_wert für Ort oder ein Telefon zu prüfen... )

Wenn so deine Daten aussähen...
XML-Code:
<?xml version="1.0" encoding="utf-8" ?>
<Probanten xmlns="http://Salem.net/SalemSchema2.xsd">
  <Probant Id="1">
    <Ort>Mööphausen</Ort>
    <TelefonEinträge>
      
      <Eintrag Typ="Privat"
               Nummer="023-40044"/>
      
      <Eintrag Typ="Geschäftlich"
               Nummer="0123-28j9"/>
    </TelefonEinträge>
  </Probant>
  <Probant Id="2">
    <Ort>Mööphausen</Ort>
    <TelefonEinträge>
      
      <Eintrag Typ="Privat"
               Nummer="1233 40244"/>
      
      <Eintrag Typ="Mobil"
               Nummer="930-40044"/>
      
      <Eintrag Typ="Hallo"
               Nummer="031-42044"/>
    </TelefonEinträge>
  </Probant>
</Probanten>
könnte man plötzlich alles mögliche prüfen lassen. (Telefonnummern inklusive Vorwahl, Eindeutigkeiten,...)

Zum Beispiel mit dem Schema (Ich hoffe die Kommentare reichen):
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://Salem.net/SalemSchema2.xsd"
           elementFormDefault="qualified"
           xmlns="http://Salem.net/SalemSchema2.xsd"
           xmlns:mstns="http://Salem.net/SalemSchema2.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

  
  <xs:element name="Probanten"
              type="ProbantenListe">

    
    <xs:unique name="EinmaligerProbant">
      <xs:selector xpath="./Probant" />
      <xs:field xpath="@Id" />
    </xs:unique>
  </xs:element>

  
  <xs:complexType name="ProbantenListe">
    <xs:sequence>
      <xs:element name="Probant"
                  type="ProbantenEintrag"
                  minOccurs="1"
                  maxOccurs="unbounded">
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ProbantenEintrag">
    <xs:sequence>
      <xs:element maxOccurs="unbounded"
                  name="Ort"
                  type="xs:string">
      </xs:element>
      <xs:element name="TelefonEinträge"
                  type="TelefonEintragListe">

        
        <xs:unique name="EinmaligerTelefonTyp">
          <xs:selector xpath="./Eintrag" />
          <xs:field xpath="@Typ" />
        </xs:unique>

        <xs:unique name="EinmaligeTelefonNummer">
          <xs:selector xpath="./Eintrag" />
          <xs:field xpath="@Nummer" />
        </xs:unique>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="Id"
                  type="xs:integer"
                  use="required" />
  </xs:complexType>

  <xs:complexType name="TelefonEintragListe">
    <xs:sequence>
      <xs:element name="Eintrag"
                  type="TelefonEintrag"
                  minOccurs="1"
                  maxOccurs="unbounded">
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="TelefonEintrag">
    <xs:attribute name="Typ"
                  type="TelefonTyp"
                  use="required" />
    <xs:attribute name="Nummer"
                  type="TelefonNummer"
                  use="required" />
  </xs:complexType>

  <xs:simpleType name="TelefonTyp">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Privat" />
      <xs:enumeration value="Geschäftlich" />
      <xs:enumeration value="Mobil" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="TelefonNummer">
    <xs:restriction base="xs:string">
      <!--beginned mit 0, 2 bis 5 Stellen restliche Vorwahl;
          3 bis 10 Stellen Hauptnummer; getrennt durch ein "-" -->

      <xs:pattern value="0\d{2,5}[/-]\d{3,10}" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
Wie gesagt, XSD lässt sehr aufwenide Prüfungen zu, ohne dass du wirklich aufwendig viel schreiben musst. Dass da oben habe ich einfach zusammengeklickt. (siehe Anhang)

Wie du es in Delphi32 mit MS XML verwendest kann ich dir nicht sagen (befasse mich erst seit .Net intensiver mit XML), aber der Simmatze wird hier ganz sicher vorbeistolpern.

btw: Ich hoffe es ist nicht zuuu offensichtlich, dass ich gerne XSDs zusammenfriemel.
Miniaturansicht angehängter Grafiken
salemschemadesign_798.png  
  Mit Zitat antworten Zitat