![]() |
Validieren einer XML die 99.te
Moin Moin.
Zum Thema 'Validieren' habe ich in den Posts hier und in der Google Welt allerlei gefunden, aber nichts hilft mit weiter. Die XML : (Aressenliste.xml)
Code:
Die XSD: (Adressenliste.xsd)
<?xml version="1.0"?>
<Adressen xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance" xsi:schemaLocation="Adressenliste.xsd"> <Adresse> <Index>Käsekuchen</Index> <Anrede>Frau</Anrede> <Titel>Dr.</Titel> <Vorname>Anneliese</Vorname> <Nachname>Rampelburger-Meschbach</Nachname> <Strasse>Knödelweg</Strasse> <Hausnummer>38</Hausnummer> <Postleitzahl>47120</Postleitzahl> <Ort>Kassebur-Segersheim</Ort> <Telefon>04985/83984938</Telefon> <Mobil>0175/3986582364</Mobil> <EMail>Anneliese@t-online.jo</EMail> <Geburtsdatum>12-12-12</Geburtsdatum> <Kommentar></Kommentar> </Adresse> </Adressen>
Code:
Der Code zum validieren:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Adressen"> <xs:complexType> <xs:sequence> <xs:element name="Adresse" maxOccurs="unbounded" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element type="xs:int" name="Index"/> <xs:element type="xs:string" name="Anrede"/> <xs:element type="xs:string" name="Titel"/> <xs:element type="xs:string" name="Vorname"/> <xs:element type="xs:string" name="Nachname"/> <xs:element type="xs:string" name="Strasse"/> <xs:element type="xs:integer" name="Hausnummer"/> <xs:element type="xs:int" name="Postleitzahl"/> <xs:element type="xs:string" name="Ort"/> <xs:element type="xs:string" name="Telefon"/> <xs:element type="xs:string" name="Mobil"/> <xs:element type="xs:string" name="EMail"/> <xs:element type="xs:date" name="Geburtsdatum"/> <xs:element type="xs:string" name="Kommentar"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Code:
Trotz des offensichtlichen Fehlers im Feld <Index> (Käsekuchen ist ja wohl kein 32er Integer) läuft die Validierung anstandslos durch.
uses MSXML, Xml.XMLIntf, XML.XMLDoc, XML.XMLDOM;
function Validate_XML(xmlFile:String): Boolean; var XMLDoc: IXMLDocument; T0,T1,T2,T3,T4:String; begin XMLDoc := NewXMLDocument; XMLDoc.ParseOptions := [poResolveExternals, poValidateOnParse]; Result := True; try XMLDoc.LoadFromFile(xmlFile) ; XMLDoc.Active := true; except on E: EDomParseError do begin If LastDelimiter('\',E.URL) = 0 then T0:= Copy(E.URL,LastDelimiter('/',E.URL)+1,50); If LastDelimiter('/',E.URL) = 0 then T0:= Copy(E.URL,LastDelimiter('\',E.URL)+1,50); T1:= 'Bei der Validierung der ' + T0 + ' wurde folgender Fehler festgestellt:' + #13 +#13; T2:= E.Reason + #13; // Grund T3:= 'Fehler in Zeile : ' + IntToStr(E.Line) + #13; // Zeile T4:= 'Text der Zeile : ' + Trim(E.SrcText) + #13 + #13; // Zeilentext If E.ErrorCode <> -2146697210 then begin Application.MessageBox(Pchar(T1+T2+T3+T4),Pchar('Validierungsfehler'),16); end; Result:=False; end; end; end; Was ist da verkehrt? Gibts noch andere Möglichkeiten in Delphi? creehawk Delphi 10.2. Tokyo Windows 10 |
AW: Validieren einer XML die 99.te
Wir benutzen hier:
Delphi-Quellcode:
Aufruf:
unit XMLValidate;
// Requirements ---------------------------------------------------------------- // // MSXML 4.0 Service Pack 1 // http://www.microsoft.com/downloads/release.asp?releaseid=37176 // // ----------------------------------------------------------------------------- interface uses SysUtils; type EValidateXMLError = class(Exception) private FErrorCode: Integer; FerrorLine: Integer; FReason: string; public constructor Create(AErrorCode: Integer; const Aline: Integer; const AReason: string); property ErrorCode: Integer read FErrorCode; property Reason: string read FReason; end; procedure ValidateXMLDoc(const XmlTestFile, SchemaLocation, SchemaNS: WideString); overload; implementation uses Windows, ComObj, MSXML2_TLB; resourcestring RsValidateError = 'Validate XML Error (%.8x), Line (%D), Reason: %s'; { EValidateXMLError } constructor EValidateXMLError.Create(AErrorCode: Integer; const Aline: Integer; const AReason: string); begin inherited CreateResFmt(@RsValidateError, [AErrorCode, Aline, AReason]); FErrorCode := AErrorCode; FReason := AReason; FerrorLine := Aline; end; procedure ValidateXMLDoc(const XmlTestFile, SchemaLocation, SchemaNS: WideString); var xml, xsd: IXMLDOMDocument2; cache: IXMLDOMSchemaCollection; res: boolean; err: IXMLDOMParseError; begin xsd := CoDOMDocument40.Create; xsd.async := False; xsd.load(SchemaLocation); cache := CoXMLSchemaCache40.Create; cache.add(SchemaNS, xsd); xml := CoDOMDocument40.Create; xml.async := False; xml.schemas := cache; err := nil; res := xml.load(XmlTestFile); if not res then begin err := xml.parseError; if err <> nil then raise EValidateXMLError.Create(err.ErrorCode, err.line, err.Reason); end; end; end.
Delphi-Quellcode:
function Txmlmod.internValidatefile(aXmlFileName: string; errorlst: Tstrings): boolean;
var lSchemaFilename: string; begin result := false; lSchemaFilename := Tpath.combine(Tpath.GetDirectoryName(Globals.XMLData), 'schema_400.xsd'); try ValidateXMLDoc(aXmlFileName, lSchemaFilename, 'http://www.xmlData.com/xmlInvoice/XSD'); result := true; except on e: EValidateXMLError do begin errorlst.add(e.Message); end end; end; |
AW: Validieren einer XML die 99.te
OK, vielen Dank! Der Link übrigens führt zu 'We're sorry, this download is no longer available.', kann man aber anderweitig finden.
Nun sind aber in Windows 10 laut MS die "msxml3.dll" "msxml6.dll" enthalten. Allerdings frage ich mich dann warum Delphi 10.2 keine funktioniernde Methode beinhaltet respektive anbietet. Die von mir verwendeten Elemente geben ja die verwendeten Funktionen/Prozeduren an, man sollte sie also verwenden können. Auch wenn sie womöglich alt sind. Ist denn die Anwendung/Verwendung wie oben dargestellt falsch? creehawk |
AW: Validieren einer XML die 99.te
Dass es nicht immer funktioniert (je nach Computer / MSXML Version) und welche Besonderheiten man beachten sollte wird hier auf Stackoverflow näher ausgeführt:
Validate XML using Windows DOM and TXMLDocument: doesn't work on some computers ![]() |
AW: Validieren einer XML die 99.te
Anmerkung zu den Typen:
Die Hausnummer ist keine Zahl z.B. 2b Die Postleitzahl sollte auch keine Zahl sein w.g. führender Nullen Gruß K-H |
AW: Validieren einer XML die 99.te
Moin Moin.
Den Artikel auf stack hatte ich schon am Wickel und gelesen und getestet. Davon funktioniert nichts. ipso facto: validieren fällt aus. XML Strukturen die auf w3c feierlich verkündet werden kann ich mit den in Delphi gelieferten Instrumenten quasi nicht nutzen. Eigentlich hätte ich von Delphi als Entwicklungsumgebung da mehr erwartet. creehawk |
AW: Validieren einer XML die 99.te
Ich möchte mich hiermit in aller Form bei allen die diesen Threat gelesen und sogar geantwortet haben entschuldigen.
In tiefster Demut durfte ich nach stundenlangem Suchen feststellen, das die von mir gepostete Version anstandlos funktioniert. In der XML habe ich den Dateinamen "Adressenliste.xsd" korrekt geschrieben. Gespeichert war das Teil allerdings als "Adresenliste.xsd". Ich gehe jetzt in den GArten und grab' mich ein. creehawk |
AW: Validieren einer XML die 99.te
Seltsam, auch wenn ich die Dateien korrekt benenne, wird nicht validiert. Und das liegt an dem xsi-Namespace, den hast du falsch geschrieben.
Statt
XML-Code:
Muss der wie folgt lauten:
<?xml version="1.0"?>
<Adressen xmlns:xsi="http://www.w3.org/2001/XMLSchema-Instance" xsi:schemaLocation="Adressenliste.xsd"> <Adresse> <!-- skipped --> </Adresse> </Adressen>
XML-Code:
Eine wirklich aussagekräftige Meldung erhalte ich allerdings erst, wenn die XML-Datei so aussieht:
<?xml version="1.0"?>
<Adressen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="Adressenliste.xsd"> <Adresse> <!-- skipped --> </Adresse> </Adressen>
XML-Code:
oder auch so
<?xml version="1.0"?>
<Adressen xmlns="http://adressenliste.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://adressenliste.example.com Adressenliste.xsd"> <Adresse> <Index>Käsekuchen</Index> <Anrede>Frau</Anrede> <Titel>Dr.</Titel> <Vorname>Anneliese</Vorname> <Nachname>Rampelburger-Meschbach</Nachname> <Strasse>Knödelweg</Strasse> <Hausnummer>38</Hausnummer> <Postleitzahl>47120</Postleitzahl> <Ort>Kassebur-Segersheim</Ort> <Telefon>04985/83984938</Telefon> <Mobil>0175/3986582364</Mobil> <EMail>Anneliese@t-online.jo</EMail> <Geburtsdatum>12-12-12</Geburtsdatum> <Kommentar></Kommentar> </Adresse> </Adressen>
XML-Code:
<?xml version="1.0"?>
<Adressen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Adressenliste.xsd"> <Adresse> <Index>Käsekuchen</Index> <Anrede>Frau</Anrede> <Titel>Dr.</Titel> <Vorname>Anneliese</Vorname> <Nachname>Rampelburger-Meschbach</Nachname> <Strasse>Knödelweg</Strasse> <Hausnummer>38</Hausnummer> <Postleitzahl>47120</Postleitzahl> <Ort>Kassebur-Segersheim</Ort> <Telefon>04985/83984938</Telefon> <Mobil>0175/3986582364</Mobil> <EMail>Anneliese@t-online.jo</EMail> <Geburtsdatum>12-12-12</Geburtsdatum> <Kommentar></Kommentar> </Adresse> </Adressen> |
AW: Validieren einer XML die 99.te
Zitat:
Nicht jeder ist aber so ehrlich und schreibt das dann hier auch ;-) Von daher, grab das Loch nicht so tief :-D |
AW: Validieren einer XML die 99.te
Zitat:
Solange ich das beherzige ist alles in Ordnung. Gruß K-H P.S. Vielen Dank für den Thread, jetzt hab ich die Beispiele um mich endlich mal produktiv mit dem Thema auseinander zu setzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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