Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi xsd Validierung (https://www.delphipraxis.net/27238-xsd-validierung.html)

CelloUndCo 6. Aug 2004 09:36


xsd Validierung
 
hi,

ist es möglich auch xsd Dateien zur Validierung heranzuziehen oder geht das (nach dem Tutorial von Herrn Harms) ausschliesslich mit dtd Dateien?

lg,
Toni

CalganX 6. Aug 2004 10:31

Re: xsd Validierung
 
Hi Toni,
ich habe mich mit XSD noch nicht beschäftigt, aber wenn ich das richtig sehe (in den W3C-Definitionen) wird das beim MS XML-Parser keinen großen Unterschied machen. Sprich der sollte das auch korrekt validieren.
Aber wie gesagt: keine Garantie, weil ich XSD noch nie in meinem Leben verwendet habe. ;)

Chris

CelloUndCo 6. Aug 2004 10:38

Re: xsd Validierung
 
Hallo Chris,

ich bin eben auf diesen post gestossen und bin dabei das einmal zu versuchen.

nur von welchem Typ sollte im folgenden Codestück die Variable xsd wohl sein? (CoXMLSchemaCache40 wäre ja fast zu einfach ;) )

Code:
// create XSD schema
  xsd := CoXMLSchemaCache40.Create;
  if(xsd = nil) then
  begin
    MessageBox(self.Handle,
      pchar(NOXMLPARSER),
      nil,
      MB_OK or MB_ICONEXCLAMATION);

    fErrorExit := true;
    Application.Terminate;
    exit;
  end;
  xsd.add('',ExtractFilePath(paramstr(0)) + 'MO.xsd');
[edit=sakura] BBCodes an! Mfg, sakura[/edit]

CalganX 6. Aug 2004 10:46

Re: xsd Validierung
 
Hi,
Mathias hat hier ja einen Code gepostet. Ich vermute mal das der auch funktioniert. Du müsstest dir den SourceCode am besten mal ansehen. Dort ist das ja prüfen auf Fehler in der Datei erklärt.
Ich vermute mal, dass xmlDoc vom Typ IXMLDOMDocument2 ist. Und für den Typ von xsd musst du dir in Delphi anschauen, welchen Typ CoXMLSchemaCache40.Create zurückgibt. ;)

Chris

Robert_G 6. Aug 2004 10:54

Re: xsd Validierung
 
Falls du damit meinst, du willst nur halbwegs glaubwürdige Daten bzw. keine groben Eingabefehler/FK- oder PK-Verletzungen, dann dürfte XSD die Wahl sein. ;)

Ich habe hier mal einen Auszug meines ersten funktionstüchtigen XSD für .Net angefügt. ;)
Ist schon etwas älter, aber noch lesbar. Meine jetzigen Schemata sind ziemlich groß (das VS hat zum Glück einen visuellen XSD Designer ;) )

XML-Code:
<?xml version="1.0" standalone="yes" ?>
<xs:schema id="dsImportMe"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
    attributeFormDefault="qualified"
    elementFormDefault="qualified">
    <xs:element name="dsImportMe" msdata:IsDataSet="true">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element name="DEMOGRAPHY">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="SUBJECT_ID" type="xs:int" minOccurs="0" />
                            <xs:element name="SUBJID" minOccurs="0" >
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:maxLength value="8" />
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="COUNTRY" type="xs:decimal" minOccurs="0" />
                            <xs:element name="SEXCD" type="xs:int" minOccurs="0" />
                            <xs:element name="SITEID" type="xs:decimal" minOccurs="0" />
                            <xs:element name="RACECD" type="xs:int" minOccurs="0" />
                            <xs:element name="RACEOTH" minOccurs="0" >
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:maxLength value="20" />
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="BIRTHDT" type ="xs:dateTime" minOccurs="0" />
                            <xs:element name="TEMP" minOccurs="0" >
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="3"/>
                                        <xs:fractionDigits value="1"/>
                                        <xs:minInclusive value="36.5"/>
                                        <xs:maxInclusive value="40.5"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="RACECD">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Code" type="xs:int" />
                            <xs:element name="Label" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="SEXCD">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Code" type="xs:int" />
                            <xs:element name="Label" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:choice>
        </xs:complexType>
       
        <xs:unique name="PK_DEMO" msdata:PrimaryKey="true">
            <xs:selector xpath=".//DEMOGRAPHY" />
            <xs:field xpath="SUBJECT_ID" />
        </xs:unique>
       
        <xs:unique name="PK_Format_RACECD" msdata:PrimaryKey="true">
            <xs:selector xpath=".//RACECD" />
            <xs:field xpath="Code" />
        </xs:unique>
        <xs:unique name="PK_Format_SEXCD" msdata:PrimaryKey="true">
            <xs:selector xpath=".//SEXCD" />
            <xs:field xpath="Code" />
        </xs:unique>
       
        <xs:keyref name="FK_Format_RACECD_DEMO" refer="PK_Format_RACECD" msdata:ConstraintOnly="true"
                   msdata:UpdateRule="None" msdata:DeleteRule="None">
            <xs:selector xpath=".//DEMOGRAPHY" />
            <xs:field xpath="RACECD" />
        </xs:keyref>
        <xs:keyref name="FK_Format_SEXCD_DEMO" refer="PK_Format_SEXCD" msdata:ConstraintOnly="true"
                   msdata:UpdateRule="None" msdata:DeleteRule="None">
            <xs:selector xpath=".//DEMOGRAPHY" />
            <xs:field xpath="SEXCD" />
        </xs:keyref>
    </xs:element>
</xs:schema>

MathiasSimmack 6. Aug 2004 10:59

Re: xsd Validierung
 
Zitat:

Zitat von Chakotay1308
Mathias hat hier ja einen Code gepostet. Ich vermute mal das der auch funktioniert.

Ja. :mrgreen:

Zitat:

Ich vermute mal, dass xmlDoc vom Typ IXMLDOMDocument2 ist. Und für den Typ von xsd musst du dir in Delphi anschauen, welchen Typ CoXMLSchemaCache40.Create zurückgibt. ;)
Habe ich in der aktuellsten Version des Movie Organizer (1.8.3) benutzt, weil ich so auf die DTD verzichten konnte, die sich ja (offensichtlich) leider nicht nachträglich ergänzen lässt. Dank externem XSD ist das aber auch nicht notwendig:
Delphi-Quellcode:
var
  xsd             : XMLSchemaCache40;
  xmldoc,
  olddoc          : DOMDocument40;
Erfordert daher auch MS XML 4.

CelloUndCo 6. Aug 2004 11:05

Re: xsd Validierung
 
Die Validierung mit xsd geht also auf jeden Fall, wie im Link oben beschrieben.

Zu der Frage nach dem Typ:

ich hab jetzt mal IXMLDOMSchemaCollection2 genommen, das geht ganz gut.

hab auch die Validierung nach dem Code von Mathias Simmack getestet, und er spuckt brav fehler wenns nicht passt...

Vielen Dank für die schnelle Hilfe!

Toni

skyware 30. Mai 2006 16:42

Re: xsd Validierung
 
..doofe Frage, aber in welcher Unit sind die "IXMLDOMSchemaCollection2" und "IXMLDOMDocument2" deklariert, rsp. welche Units muss ich in die Uses ziehen???

:gruebel:

markusl 31. Mai 2006 08:30

Re: xsd Validierung
 
Hallo skyware,

du musst die Type Library des Microsoft XML Parsers importieren (Menüpunkt "Project" -> "Import Type Library" und dort die TLB ("Microsoft XML, v4.0" usw.) importieren und die erzeugte Unit in deine Uses-Clausel aufnehmen. Dort sind die ganzen Interfaces wie z.B. IXMLDOMDocument2 und IXMLDOMSchemaCollection2 und viele mehr drin definiert.

Mfg

Markus

skyware 31. Mai 2006 08:44

Re: xsd Validierung
 
danke für die Antwort! :thumb:

Bei mir stehen die Versionen

- Microsoft XML,v2.6
- Microsoft XML,v3.0
- Microsoft XML,v4.0
- Microsoft XML,v5.0

zur Verfügung.

Welche Version muss ich mindestens nehmen?
Respektive was hat es für Auswirkungen auf die Windows Rechner
auf denen ich dann das erstelle Tool verwenden will?

Ich denke mal mit der Windows Installation kommt automatisch eine Version dieses XML Parser hinzu.
Doch welche ist das?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 Uhr.
Seite 1 von 2  1 2      

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