![]() |
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:
das leerzeicht bzw. das 'ä' ist das problem, habe es zu lösen vom leerzeicht mit '*' und '' versucht , aber leicer erfolglos :wall: .
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 hat jemand vielleicht einen tipp oder empfehlung? :angel: . LG. SALEM |
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 |
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:
hoffe das reicht dir es einigermassen zu beschreiben :roll:
<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> |
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 |
Re: delphi<->XML
Liste der Anhänge anzeigen (Anzahl: 1)
wie wärs den mit simploxml?
anbei Gruss EL |
Re: delphi<->XML
jetzt geht's, weiss aber dummerweise nicht genau woran es lag! das nennt man performance SW :freak:
danke euch. LG |
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:
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.
<?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> 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:
könnte man plötzlich alles mögliche prüfen lassen. (Telefonnummern inklusive Vorwahl, Eindeutigkeiten,...)
<?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> Zum Beispiel mit dem Schema (Ich hoffe die Kommentare reichen):
XML-Code:
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)
<?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 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: |
Re: delphi<->XML
Delphi-Quellcode:
Vielleicht so ?
stammdaten.telefonPrivat:= trim(Values['telefon privat']);
|
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