Fehlerbehebung beim Dokumentformat Die Liste meiner Mutter enthält Dutzende, wenn nicht Hunderte von Rezepten. Wenn ein schwerwiegender Fehler auftritt, wird das Debuggen sehr schwierig – Sie müssen Zeile für Zeile nach der fehlenden Markierung suchen. Wenn Sie mehrere Verschachtelungsebenen verwenden, wird es schwierig, Fehler zu finden.
Aber es gibt gute Hilfe. Parser – Anwendungen, die XML-Code analysieren und fehlerhafte Fehler melden, sind online frei verfügbar. Das beste davon ist Lark, geschrieben von Tim Bray – technischer Redakteur und lautstarker Verfechter der XML-Spezifikation, einer der klügsten Menschen auf dem Planeten.
Ich verwende Lark, um den folgenden Code zu analysieren. Beachten Sie, dass „Schokoladenchips“ und sein schließendes Tag im </ingredients>-Tag an der falschen Position erscheinen:
<?xml version="1.0"?>
<list>
<recipe>
<author>Carol Schmidt</author>
<recipe_name >Chocolate Chip Bars</recipe_name>
<meal>Dinner
<course>Dessert</course>
</meal>
<ingredients>
<item>2/3 C Butter</item>
<item>2 C brauner Zucker</ item>
<item>1 TL Vanille</item>
<item>1 3/4 C ungesiebtes Allzweckmehl</item>
<item>1 1/2 TL Backpulver</item>
<item>1/2 TL Salz< /item>
<item>3 Eier</item>
<item>1/2 C gehackte Nüsse</item>
</ingredients>
2 Tassen (12-Unzen-Pkg.) halbsüße Schokoladenchips
< /item >
<Anweisungen>
Butter auf 350 Grad vorheizen;
zum
Abkühlen
beiseite stellen
. Die zurückbehaltenen trockenen
Zutaten, die Nüsse und die Chips
einrühren
und
25 bis 30 Minuten lang
goldbraun
backen.
list>
Die folgenden Ergebnisse werden vom Analysator zurückgegeben:
Fehlerbericht
Zeile 17, Spalte 22: Encountered </ingredients> erwartet </item>
... angenommen </item>
Zeile 18, Spalte 36: Encountered </item> mit Kein Start-Tag.
Mit diesen Informationen ist das Auffinden des Fehlers kein Problem. Was bedeutet also die Gültigkeit einer XML-Datei?
Effektivität implementieren Letztendlich werden wir Informationen zu einem gut organisierten XML-Dokument hinzufügen. Eigentlich haben wir viel zu tun – es lauern immer noch Krisen – und obwohl die XML-Datei gut organisiert ist,
Aber auch wichtige Informationen können verloren gehen. Schauen Sie sich das folgende Beispiel an:
<recipe>
<Autorin>Carol Schmidt</Autorin>
<recipe_name>Schokoladenchips</recipe_name>
<meal>Abendessen <course>Dessert</course> </meal>
<Zutaten> </Zutaten>
<directions>Butter schmelzen, mit usw. kombinieren ... </directions>
</recipe>
Dieses Rezept enthält keine Zutaten und weil es so gut organisiert ist,
Auch der Lark-Analysator findet das Problem nicht. Jeder, der selbst die harmlosesten Datenbanken verwaltet hat, kennt den Fehler, den wir Menschen machen: Wenn wir die Chance dazu bekommen, werfen wir wichtige Informationen weg und fügen nutzlosen Unsinn hinzu. Deshalb hat der Erfinder von XML DTD eingeführt -
Dokumenttypdefinition. DTDs bieten eine Möglichkeit, sicherzustellen, dass XML mehr oder weniger Ihren Wünschen entspricht.
Schauen wir uns eine DTD an, die in Rezepten verwendet wird.
<!DOCTYPE-Liste [
<!ELEMENT-Rezept (Rezeptname, Autor, Mahlzeit, Zutaten, Anweisungen)>
<!ELEMENT Zutaten (item+)>
<!ELEMENT Mahlzeit (#PCDATA, natürlich?)>
<!ELEMENT item (#PCDATA, sub_item*)>
<!ELEMENT Rezeptname (#PCDATA)>
<!ELEMENT Autor (#PCDATA)>
<!ELEMENT-Kurs (#PCDATA)>
<!ELEMENT-Element (#PCDATA)>
<!ELEMENT subitem (#PCDATA)>
<!ELEMENT Directions (#PCDATA)>
]>
Der Code mag auf den ersten Blick unfreundlich erscheinen, aber wenn man ihn aufschlüsselt, macht er Sinn. Lassen Sie es uns im Detail erklären:
<!DOCTYPE list [
Diese Zeile besagt, dass es sich bei dem in eckigen Klammern eingeschlossenen Dokument um ein Dokument mit dem Wurzelelement <list> handelt
DTD. Wie bereits erwähnt, enthält das Wurzelelement alle anderen Elemente.
<!ELEMENT Rezept (Rezeptname, Mahlzeit, Zutaten, Anweisungen)>
Diese Zeile definiert das <recipe>-Tag. Die Klammern bedeuten, dass die vier Tags der Reihe nach im <recipe>-Tag erscheinen müssen.
<!ELEMENT Mahlzeit (#PCDATA, Kurs?)>
Diese Zeile bedarf einer ausführlichen Erklärung. Ich habe folgende Struktur definiert:
<Mahlzeit>Hier ist der Name der Mahlzeit obligatorisch
<Kurs>Ein Kursname wird möglicherweise angezeigt, ist jedoch nicht vorhanden
obligatorisch</course>
</meal>
Ich mache das, weil meiner Meinung nach das Mittagessen nicht unbedingt ein bestimmtes Gericht sein muss, das Abendessen jedoch auf Vorspeisen, Hauptgerichte und Desserts hinweisen kann. Durch Angabe
#PCDATA – Stellt analysierte Zeichendaten (d. h. nicht-binäre Daten) dar, um diese Funktionalität zu implementieren. Hier ist #PCDATA Text – zum Beispiel „Dinner“.
Das Fragezeichen nach „Kurs“ zeigt an, dass 0 oder 1 Paare von <Kurs>-Tags in <Mahlzeit> erscheinen
innerhalb der Markierung.
Schauen wir uns nun die nächste Zeile an:
<!ELEMENT Ingredients (item+)>
Das Pluszeichen hier zeigt an, dass mindestens ein Paar <item>-Tags in <ingredients> erscheinen sollte
innerhalb der Markierung.
Die letzte Zeile, die uns interessiert, ist:
<!ELEMENT item (#PCDATA, sub_item*)>
Ich habe sub_item* als Sicherheitsmaßnahme eingegeben. Ich frage nicht nur nach dem Text jedes Artikels, sondern möchte auch den Umfang des Inhalts jedes Artikels zählen. Das Sternchen gibt die Anzahl der Unterelemente an, die im <item>-Tag enthalten sein können. Für das Chocolate Chip Bars-Rezept benötige ich keine Unterpunkte, aber das ist praktisch, wenn die Zutaten komplex sind.
Lassen Sie uns das nun zusammenstellen und sehen, was wir bekommen.
Vollständiges Beispiel einer DTD Nachfolgend finden Sie ein vollständiges Beispiel. Ich habe der Datei ein weiteres Rezept hinzugefügt und hinzugefügt
Die DTD ist mit Anmerkungen versehen. Sie können feststellen, dass ich im zweiten Rezept Unterelemente verwendet habe.
<?xml version="1.0"?>
<!--Dies startet die DTD. Die ersten vier Zeilen adressieren die Dokumentstruktur-->
<!DOCTYPE-Liste ][
<!ELEMENT-Rezept (Rezeptname, Autor, Mahlzeit, Zutaten, Wegbeschreibung)>
<!ELEMENT Zutaten (item+)>
<!ELEMENT Mahlzeit (#PCDATA, natürlich?)>
<!ELEMENT item (#PCDATA, sub_item*)>
<!--Dies sind die verbleibenden Elemente des Rezept-Tags -->
<!ELEMENT Rezeptname (#PCDATA)>
<!ELEMENT Autor (#PCDATA)>
<!ELEMENT Directions (#PCDATA)>
<!--Das verbleibende Element des Mahlzeit-Tags -->
<!ELEMENT-Kurs (#PCDATA)>
<!--Das verbleibende Element des Artikel-Tags -->
<!ELEMENT sub_item (#PCDATA)>
]>
<?xml version="1.0"?>
<Liste>
<Rezept>
<Autorin>Carol Schmidt</Autorin>
<recipe_name>Schokoladenchips</recipe_name>
<Mahlzeit>Abendessen
<Kurs>Dessert</Kurs>
</meal>
<Zutaten>
<item>2/3 C Butter</item>
<item>2 C brauner Zucker</item>
<item>1 TL Vanille</item>
<item>1 3/4 C ungesiebtes Allzweckmehl</item>
<item>1 1/2 TL Backpulver</item>
<item>1/2 TL Salz</item>
<item>3 Eier</item>
<item>1/2 C gehackte Nüsse</item>
<item>2 Tassen (12-Unzen-Pkg.) halbsüße Chips</item>
</Zutaten>
<Wegbeschreibung>
Den Ofen auf 350 Grad vorheizen.
Mit braunem Zucker und Vanille in einer großen Rührschüssel vermischen.
Zum Abkühlen beiseite stellen. Mehl, Backpulver und Salz vermischen.
Beiseite stellen. Eier zur abgekühlten Zuckermischung geben und gut verrühren.
Beiseite gestellte trockene Zutaten, Nüsse und Chips unterrühren.
In einer gefetteten 13 x 9 Zoll großen Pfanne verteilen.
25 bis 30 Minuten backen, bis es goldbraun ist.
In Quadrate schneiden.
</directions>
</recipe>
<Rezept>
<recipe_name>Pasta mit Tomatensauce</recipe_name>
<Mahlzeit>Abendessen
<Kurs>Vorspeise</Kurs>
</meal>
<Zutaten>
<item>1 Pfund Spaghetti</item>
<item>1 16-Unzen-Dose gewürfelte Tomaten</item>
<item>4 Knoblauchzehen</item>
<item>1 gewürfelte Zwiebel</item>
<item>Italienisches Gewürz
<sub_item>Oregano</sub_item>
<sub_item>Basilikum</sub_item>
<sub_item>zerkleinerte rote Paprika</sub_item>
</item>
</Zutaten>
<Wegbeschreibung>
Nudeln kochen. Knoblauch und Zwiebel anbraten.
Tomaten hinzufügen. Heiß servieren.
</directions>
</recipe>
</list>
Da es nun eine DTD gibt, wird das Dokument daraufhin überprüft, ob es den durch die DTD festgelegten Einschränkungen entspricht. Mit anderen Worten: Wir wollen die Gültigkeit des Dokuments sicherstellen.
Um dies zu erreichen, benötigen wir ein weiteres Werkzeug: einen Validitätsanalysator. MSXML von Microsoft, ein Java-basiertes Programm, ist einfach zu verwenden und funktioniert gut. Das obige Dokument wurde von diesem Programm überprüft und es wurden keine Fehler gefunden. Aber wenn ich a überprüfe
Rezepte, die keinen Artikel im Zutaten-Tag enthalten, geben die folgende Meldung zurück:
Zutaten sind nicht vollständig. Erwartete Elemente [Artikel].