![]() |
XML-Datei mit dtd Datei darstellen
Ich versuche gerade eine XML Datei mittels einer dtd Datei darzustellen. Leider scheitere ich an dem Versuch das Beispiel von hier:
![]() Meine XML Datei sieht so aus:
XML-Code:
Und der Versuch meiner dtd Datei:
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!-- <!DOCTYPE Kontakte SYSTEM "Kontakte.dtd"> --> - <adressdb> - <XMLFile> <MajorVersion>1</MajorVersion> <MinorVersion>109</MinorVersion> <Computer>HAL9000</Computer> <User>Michael</User> <ModifyDate>2004-04-19</ModifyDate> <ModifyTime>12:35:29</ModifyTime> <RecordCount>62</RecordCount> <HighestID>77</HighestID> </XMLFile> - <Kontakt> <ID>2</ID> <Name>Alt</Name> <Vorname>Stephan</Vorname> <Strasse>Ellerhofer Straße 11</Strasse> <PLZ>34121</PLZ> <Ort>Kassel</Ort> <Land /> <Telefon1>(0561) 2860736</Telefon1> <Telefon2>0160 93052660</Telefon2> <Fax /> <EMail1>stephan.alt@gmx.net</EMail1> <EMail2 /> <URL /> <GebDat /> <Firma /> <Position /> <Bem /> <InBericht>0</InBericht> </Kontakt> - <Kontakt> <ID>3</ID> <Name /> <Vorname>Angie</Vorname> <Strasse>Philosophenweg 49</Strasse> <PLZ /> <Ort>Kassel</Ort> <Land /> <Telefon1 />
XML-Code:
Aber irgendwie klappt das nicht so ganz. Weiß da jemand von euch weiter oder so?
<!ELEMENT adressdb (XMLFile)>
<!ELEMENT XMLFile (MajorVersion)> <!ELMENT XMLFile (MinorVersion)> |
Re: XML-Datei mit dtd Datei darstellen
Was genau funzt nicht? Müsstest du schon genauer beschreiben?!?
|
Re: XML-Datei mit dtd Datei darstellen
Nu ja, ich bekomme eine Fehlermeldung im IE präsentiert bzw. die XML Datei so wie sie ist. Die zweite zeile habe ich nur auskommentiert, um die XML Datei hier rein kopieren zu können.
|
Re: XML-Datei mit dtd Datei darstellen
Zitat:
müsste das letzte hier nicht ELEMENT heißen? mfG mirage228 |
Re: XML-Datei mit dtd Datei darstellen
@Luckie: Die DTD müsste in deiner Datei so aussehen:
Code:
Du gibts einfach nur die Elemente an, die du benutzt hast, in der Reihenfolge, in der du sie benutzt hast. Damit zwingst du den Parser, eine XML-Datei nur zu akzeptieren, wenn die Knoten vorhanden sind und der Reihenfolge entsprechen.
<!ELEMENT adressdb (XMLFile, Kontakt+)>
<!ELEMENT XMLFile (MajorVersion, MinorVersion, Computer, User, ...)> <!ELEMENT MajorVersion (#PCDATA)> ... <!ELEMENT Kontakt (ID, Name, Vorname, ...)> <!ELEMENT ID (#PCDATA)> ... Die Knoten, die ihrerseits nur Text enthalten, kriegen die Angabe (#PCDATA) in Klammern. Ganz oben siehst du "Knoten+", d.h. es muss min. 1 Knoten namens <Kontakt> vorhanden sein, durch das Plus sind aber durchaus mehrere erlaubt. Edit: Und Zitat:
Edit 2: Und zum Darstellen würde ich ein XSL-Stylesheet/Transform benutzen. In dem kannst du mit herkömmlichen HTML-Code arbeiten und Tabellen erzeugen, usw. |
Re: XML-Datei mit dtd Datei darstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Keine Ahnung ob´s dich interessiert, @Luckie, aber im Anhang mal ein XSL-Stylesheet, das du wie folgt einbindest:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
[color=#ff0000]<?xml-stylesheet href="Kontakte.xsl" type="text/xsl"?>[/color] <!DOCTYPE adressdb SYSTEM "Kontakte.dtd"> |
Re: XML-Datei mit dtd Datei darstellen
Danke, spitze. Auf dich ist verlass. Muss ich mir nur noch mal genauer ankucken, das mit den verschachtelten Knoten ist nicht so ganz einfach.
Aber eine Frage habe ich schon: Was kann für die "..." in deinem Beipsiel stehen? |
Re: XML-Datei mit dtd Datei darstellen
Liste der Anhänge anzeigen (Anzahl: 2)
Als Tool-Programmierer habe ich sogar schon einen Konverter fertig, der dein altes Datenbank-Format in das neue XML-Format umbaut. ;) Quasi von INI nach XML, denn du hattest ja schon mal so ein Adressenprogramm.
Äh, 3 Punkte? Ach so, du meinst den Auszug aus der DTD. Pass auf - Die DTD hat mit dem visuellen Aufbau der XML-Datei nichts zu tun. Sie beschreibt nur den strukturellen Aufbau, damit dein Parser weiß wann ein Dokument gültig ist und wann nicht. Du musst alle Elemente auflisten, die in deinem Dokument vorkommen dürfen bzw. können. Im Fall des Hauptknotens sieht das eben so aus
Code:
weil er einen Knoten <XMLFile> enthalten muss, und weil min. 1 <Kontakt>-Knoten da sein muss. Wie gesagt, das Plus symbolisiert, dass es auch mehrere sein dürfen.
<!ELEMENT adressdb (XMLFile, Kontakt+)>
Jetzt musst du dem Parser erklären, was "XMLFile" bedeutet. Das ist ja nun auch wieder ein Knoten, der seinerseits untergeordnete Elemente enthält. Und genau die gibst du alle in, so wie sie in deiner XML-Datei auftauchen, also:
Code:
Tja, nun weiß der Parser nicht, was "MajorVersion" ist. Und das ist das erste Element, das keinen Knoten sondern einen Wert enthält. Und deshalb schreibst du diesmal
<!ELEMENT XMLFile (MajorVersion, MinorVersion, Computer, User, ModifyDate,
ModifyTime, RecordCount, HighestID)>
Code:
#PCDATA bedeutet aber, dass der Knoten nur Text enthalten darf. Andere Knoten darf es hier nicht geben, es sei denn, du würdest die wieder auflisten, usw. Du kannst anstelle von (#PCDATA) bspw. auch ANY schreiben (dann wäre jeder Inhalt erlaubt) oder EMPTY (dann müsste der Knoten zwingend leer sein).
<!ELEMENT MajorVersion (#PCDATA)>
Und das musst du für alle Knoten machen, die in deiner XML-Datei auftauchen. Generell würde ich empfehlen, du nutzt die Möglichkeiten des Parsers. Wenn du nämlich eine DTD benutzt und mit der oder dem Dokument stimmt was nicht, dann meckert er nicht nur, sondern er sagt auch, warum und wo der Fehler ist. Ich hänge mal die DTD ran und ein kleines Programm, das ich zum Prüfen von XML-Dateien benutze. Aber erwarte nicht zuviel von letzterem. Es ist absolut rudimentär und keinesfalls für jeden Fehlerfall abgesichert. Aber es erfüllt seinen Zweck. (Du musst wahrscheinlich die XML-Unit umbenennen ... na ja, du weißt ja sicher inzwischen, dass die bei mir MSXML4 heißt. ;)) |
Re: XML-Datei mit dtd Datei darstellen
Das hat mir viel geholfen, die Erklärung war echt gut und verständlich.
Kannst du mir die xsl-Datei noch mal etwas erläutern? :oops: |
Re: XML-Datei mit dtd Datei darstellen
Klar, ein paar Auszüge:
Code:
ist quasi eine Generalanweisung, alles noch kommende zu parsen. Und das erste, das da kommt, wäre dann dein <adressdb>-Knoten. (Edit: Die Reihenfolge ist dabei nicht wichtig, wollt´ ich nur so anmerken. Ich habe mir nur angewöhnt, die Templates in der Reihenfolge zu schreiben, in der die Knoten im Dokument auftauchen.)
<xsl:template match="/">
<xsl:apply-templates/> </xsl:template>
Code:
Zu beachten: obwohl es sich hier um HTML-Code handelt, befindest du dich ja immer noch in einer Datei mit XML-Format. Du musst also alle Einzeltags (wie
<xsl:template match="adressdb">
<html> <head> <title>AdressDB-Reader</title> <link rel="stylesheet" type="text/css" href="stylesheet.css"/> </head> <body> , <link> oder <img>) schließen. Dann kannst du bspw. ganz gezielt festlegen, welcher Knoten jetzt geparst werden soll: in dem Fall die Angaben zur Datei:
Code:
Damit kannst du den HTML-Output beliebig verändern. Ein Pluspunkt bei DOM: egal wo die Knoten im Dokument stehen (ob am Anfang oder Ende), du kannst sagen wann sie berücksichtigt werden sollen.
<xsl:apply-templates select="XMLFile"/>
Jetzt ein bisschen Spielerei ;). Die XSL-Datei schaut, ob es <Kontakt>-Knoten gibt. Die Bedingungsprüfung "count(child::Kontakt)>0" (> = größer-als = weil > ja auch ein Tag-Zeichen ist) wäre mit dem Delphi-Programm so was wie
Delphi-Quellcode:
Wenn Knoten vorhanden sind, baut er für jeden einen Anker:
nl := xmldoc.selectNodes('/adressdb/Kontakt');
if(nl.length > 0) then ...
Code:
was in dem Fall mit einer Schleife recht fix geht:
<xsl:if test="count(child::Kontakt)>0">
[b]Direktwahl[/b]:
Code:
Als Anker wird der Inhalt der Knoten <Vorname> und <Name> benutzt, sowie die aktuelle Position (falls es doch mal zwei Einträge gleichen Namens gibt)
<xsl:for-each select="Kontakt">
Code:
Und dann wird noch mal dafür gesorgt, dass die vorhandenen <Kontakt>-Knoten geparst und damit die Daten angezeigt werden:
<a href="#{Vorname}_{Name}:{position()}">
<xsl:value-of select="Vorname"/> <xsl:value-of select="Name"/> </a> </xsl:for-each> </p><hr size="1"/> </xsl:if>
Code:
<xsl:apply-templates select="Kontakt"/>
</body> </html> </xsl:template> Du musst also dafür sorgen, dass die XSL-Datei jeden Knoten kennt. Dazu benutzt du einfach das Grundmuster:
Code:
Ein Sonderfall wären Templates für (ich nenne sie mal) "virtuelle" Knoten, die es im Dokument gar nicht gibt. Da schreibst du
<xsl:template match="Knotenname">
</xsl:template>
Code:
So ein Template kannst du dann an beliebiger Stelle in der XSL-Datei durch
<xsl:template [color=#ff0000]name[/color]="Knotenname">
</xsl:template>
Code:
aufrufen. Das könntest du bspw. benutzen, um auf der XML-Datei die Navigation deiner HP unterzubringen. Die kommt ja im Dokument nicht vor (nehme ich mal an), also ließe sie sich über so ein Template ergänzen. ;)
<xsl:call-template name="Knotenname"/>
Im PSDK findest du dazu einige Beispiele und Erläuterungen. Wenn du willst, hänge ich dir mal ein paar XML-Dateien von meiner Seite ran. Quasi die Umsetzungen der "doku"-Sparte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 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