AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML-Datei mit dtd Datei darstellen

Ein Thema von Luckie · begonnen am 19. Apr 2004 · letzter Beitrag vom 21. Apr 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

XML-Datei mit dtd Datei darstellen

  Alt 19. Apr 2004, 13:36
Ich versuche gerade eine XML Datei mittels einer dtd Datei darzustellen. Leider scheitere ich an dem Versuch das Beispiel von hier: http://www.selfhtml.teamone.de/xml/darstellung/css.htm umzusetzten.

Meine XML Datei sieht so aus:
XML-Code:
<?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 />
Und der Versuch meiner dtd Datei:
XML-Code:
<!ELEMENT adressdb (XMLFile)>
<!ELEMENT XMLFile (MajorVersion)>
<!ELMENT XMLFile (MinorVersion)>
Aber irgendwie klappt das nicht so ganz. Weiß da jemand von euch weiter oder so?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#2

Re: XML-Datei mit dtd Datei darstellen

  Alt 19. Apr 2004, 13:38
Was genau funzt nicht? Müsstest du schon genauer beschreiben?!?
Julian J. Pracht
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: XML-Datei mit dtd Datei darstellen

  Alt 19. Apr 2004, 13:41
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: XML-Datei mit dtd Datei darstellen

  Alt 19. Apr 2004, 14:06
Zitat von Luckie:
XML-Code:
<!ELEMENT adressdb (XMLFile)>
<!ELEMENT XMLFile (MajorVersion)>
<!ELMENT XMLFile (MinorVersion)>
Hi,

müsste das letzte hier nicht ELEMENT heißen?

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: XML-Datei mit dtd Datei darstellen

  Alt 19. Apr 2004, 14:57
@Luckie: Die DTD müsste in deiner Datei so aussehen:
Code:
<!ELEMENT adressdb (XMLFile, Kontakt+)>
<!ELEMENT XMLFile (MajorVersion, MinorVersion, Computer, User, ...)>
<!ELEMENT MajorVersion (#PCDATA)>

...

<!ELEMENT Kontakt (ID, Name, Vorname, ...)>
<!ELEMENT ID (#PCDATA)>

...
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.
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:
Code:
<!DOCTYPE Kontakte SYSTEM "Kontakte.dtd">
wäre falsch, weil dein root-Knoten <adressdb> heißt und nicht <Kontakte>.

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.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#6

Re: XML-Datei mit dtd Datei darstellen

  Alt 19. Apr 2004, 15:46
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">
Angehängte Dateien
Dateityp: txt kontakte.xsl.txt (3,3 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: XML-Datei mit dtd Datei darstellen

  Alt 19. Apr 2004, 23:56
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: XML-Datei mit dtd Datei darstellen

  Alt 20. Apr 2004, 00:33
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:
<!ELEMENT adressdb (XMLFile, Kontakt+)>
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.

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:
<!ELEMENT XMLFile (MajorVersion, MinorVersion, Computer, User, ModifyDate,
  ModifyTime, RecordCount, HighestID)>
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
Code:
<!ELEMENT MajorVersion (#PCDATA)>
#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).

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. )
Angehängte Dateien
Dateityp: zip xml-pr_fprogramm.zip (2,1 KB, 11x aufgerufen)
Dateityp: txt kontakte.dtd.txt (1,1 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: XML-Datei mit dtd Datei darstellen

  Alt 20. Apr 2004, 01:03
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: XML-Datei mit dtd Datei darstellen

  Alt 20. Apr 2004, 08:37
Klar, ein paar Auszüge:
Code:
<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>
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.)
Code:
<xsl:template match="adressdb">
  <html>
    <head>
      <title>AdressDB-Reader</title>
      <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
    </head>
    <body>
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
, <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:
      <xsl:apply-templates select="XMLFile"/>
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.

Jetzt ein bisschen Spielerei . Die XSL-Datei schaut, ob es <Kontakt>-Knoten gibt. Die Bedingungsprüfung "count(child::Kontakt)&gt;0" (&gt; = größer-als = weil > ja auch ein Tag-Zeichen ist) wäre mit dem Delphi-Programm so was wie
Delphi-Quellcode:
nl := xmldoc.selectNodes('/adressdb/Kontakt');
if(nl.length > 0) then ...
Wenn Knoten vorhanden sind, baut er für jeden einen Anker:
Code:
      <xsl:if test="count(child::Kontakt)&gt;0">
       

[b]Direktwahl[/b]:
was in dem Fall mit einer Schleife recht fix geht:
Code:
          <xsl:for-each select="Kontakt">
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)
Code:
            <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>
Und dann wird noch mal dafür gesorgt, dass die vorhandenen <Kontakt>-Knoten geparst und damit die Daten angezeigt werden:
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:
<xsl:template match="Knotenname">
 
</xsl:template>
Ein Sonderfall wären Templates für (ich nenne sie mal) "virtuelle" Knoten, die es im Dokument gar nicht gibt. Da schreibst du
Code:
<xsl:template [color=#ff0000]name[/color]="Knotenname">
 
</xsl:template>
So ein Template kannst du dann an beliebiger Stelle in der XSL-Datei durch
Code:
<xsl:call-template name="Knotenname"/>
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.

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 Uhr.
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