Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi delphi<->XML (https://www.delphipraxis.net/56446-delphi-xml.html)

salem01 5. Nov 2005 19:06


delphi<->XML
 
hallo zusammen,

ich habe folgendes problem:
ich will eingabe-Felder als Pflichtfelder definieren und versuche unter delphi zu überprüfen ob in diesen feldern wirklich was steht oder nicht.
Die XML sieht folgendermassen aus:
Delphi-Quellcode:
          .....
   <attribut typ="nc">
      <beschreibung>Telefon privat</beschreibung>
   </attribut>
   <attribut typ="nc">
      <beschreibung>Telefon geschäftlich</beschreibung>
   </attribut>
   <attribut typ="nc">
      <beschreibung>Mobile</beschreibung>
   </attribut>
          .....

nun will ich überprüfen, ob Telefon privat leer steht, der delphi-code sieht so aus:
Delphi-Quellcode:
with RequestInfo.Params do
       begin
        .......
        stammdaten.ort:= Values['ort'];
        stammdaten.telefonPrivat:= Values['telefon privat'];//HIER LIEGT DAS PROBLEM
        stammdaten.telefonGeschaeft:= Values['telefon geschäftlich'];//HIER LIEGT DAS PROBLEM
        stammdaten.mobile:= Values['mobile'];
        ......
        ......
if ........
      OR (stammdaten.ort = '') OR (stammdaten.telefonPrivat = '') OR
         (stammdaten.telefonGeschaeft = '') OR (stammdaten.geburtsdatum = '') OR
         (stammdaten.mobile = '') then
das leerzeicht bzw. das 'ä' ist das problem, habe es zu lösen vom leerzeicht mit '*' und '' versucht , aber leicer erfolglos :wall: .

hat jemand vielleicht einen tipp oder empfehlung? :angel: .

LG.
SALEM

marabu 5. Nov 2005 19:42

Re: delphi<->XML
 
Hallo Salem.

Wenn du schreibst mit welchen Komponenten du in deinem Code arbeitest, dann ist es leichter dir zu helfen. Mit dem gezeigten Code wirst du auch nicht auf das gezeigte XML-Fragment zugreifen - oder?

Grüße vom marabu

salem01 5. Nov 2005 20:09

Re: delphi<->XML
 
HI marabu;

hast recht, also es ist mit Delphi6 , MSXML4 geschrieben.
es läuft eigentlich sonst ok soweit, der delphi-coder stattmte aus der server-unit, die kann die daten lesen und weitervermitteln .
Ich versuche dabei einen neuen Probanden anzulegen, wobei eine attribute.xml datei mitbezogen wird, aus der die vorhandenen attribute für den anzulegenden proband zugewiesen und ausgefüllt werden.
nach dem anlegen eines probanden sieht ein pronaden-tag so aus:
Delphi-Quellcode:
<proband>
      <id>1</id>
      .....
      <attribut typ="nc">
         <beschreibung>Ort</beschreibung>
         <def_wert>Irgendwo</def_wert>
      </attribut>
      <attribut typ="nc">
         <beschreibung>Telefon privat</beschreibung>
         <def_wert>23562345</def_wert>
      </attribut>
      <attribut typ="nc">
         <beschreibung>Telefon geschäftlich</beschreibung>
         <def_wert>089585</def_wert>
      </attribut>
      <attribut typ="nc">
         <beschreibung>Mobile</beschreibung>
         <def_wert>07856780567856</def_wert>
      </attribut>
      .....
</proband>
hoffe das reicht dir es einigermassen zu beschreiben :roll:

marabu 5. Nov 2005 20:21

Re: delphi<->XML
 
Wenn Params ein Nachfahre von TStrings ist, dann kann ich dir versichern, dass du Zeichenketten als Names verwenden kannst, die Leerstellen oder Sonderzeichen enthalten. Was genau ist dein Problem?

marabu

emsländer 5. Nov 2005 20:32

Re: delphi<->XML
 
Liste der Anhänge anzeigen (Anzahl: 1)
wie wärs den mit simploxml?

anbei


Gruss

EL

salem01 5. Nov 2005 21:10

Re: delphi<->XML
 
jetzt geht's, weiss aber dummerweise nicht genau woran es lag! das nennt man performance SW :freak:

danke euch.
LG

Robert_G 6. Nov 2005 00:08

Re: delphi<->XML
 
Liste der Anhänge anzeigen (Anzahl: 1)
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. :angle2:

btw: Ich hoffe es ist nicht zuuu offensichtlich, dass ich gerne XSDs zusammenfriemel. :mrgreen:

Nightshade 6. Nov 2005 01:23

Re: delphi<->XML
 
Delphi-Quellcode:
stammdaten.telefonPrivat:= trim(Values['telefon privat']);
Vielleicht so ?

salem01 6. Nov 2005 20:57

Re: delphi<->XML
 
danke jungs,

es läuft jetzt wie vorgestellt :) .

Robert_G, danke für deine tipps, befasse mich aber seit kurzem mit xml, dabei muss man viele neue sachen wissen, z.B. wie XSD :wink: .

LG.
SALEM


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz