Wie erstelle / schreibe ich einen einfachen XML-Parser?
Wie das erstellen/schreiben einer einfachen XML-parser von Grund auf neu?
Eher als code-Beispiele, ich will wissen, was sind die vereinfachte, basic-Schritte in Englisch.
Wie ist ein guter parser entwickelt? Ich verstehe, dass regex sollte nicht verwendet werden in einem parser, aber wie viel ist regex Rolle bei der Analyse der XML?
Was ist die empfohlene Daten-Struktur verwenden? Sollte ich mit verbundenen Listen zu speichern und wieder abzurufen, Knoten, Attribute und Werte?
Ich möchte lernen, wie ein XML-parser, so dass ich schreiben kann man in der D-Programmiersprache.
InformationsquelleAutor der Frage XP1 | 2011-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht wissen, wie schreiben Sie einen parser, dann brauchen Sie, um etwas zu Lesen. Besorgen Sie ein Buch über compiler schreiben (viele der besten, die geschrieben wurden vor 30 oder 40 Jahren, z.B. Aho und Ullmann) und die Studie in den Kapiteln über die lexikalische Analyse und die Syntaxanalyse. XML ist im wesentlichen nicht anders, außer, dass die lexikalischen und Grammatik Phasen sind nicht so klar voneinander getrennt wie in einigen Sprachen.
Ein Wort der Warnung, wenn Sie wollen, schreiben Sie ein voll konformer XML-parser, dann sind 90% deiner Mühe wird aufgewendet werden immer Grenzfälle Recht in dunklen Ecken der spec Umgang mit Dingen, wie parameter-entities, die meisten XML-Nutzer sind nicht einmal bewusst.
InformationsquelleAutor der Antwort Michael Kay
Gibt es einen Unterschied zwischen einem parser und einer nodelist. Der parser ist der Teil, nimmt eine Reihe von nur-text-XML und versucht zu bestimmen, welche Knoten es gibt. Dann gibt es eine interne Struktur, die Sie speichern die Knoten in. In einer Schicht über der Struktur, finden Sie den DOM, das Document Object Model. Dies ist eine Struktur von verschachtelten Knoten, aus denen sich das XML-Dokument. Der parser muss nur wissen das generische DOM-Schnittstelle zu erstellen, nodes.
Ich würde nicht mit regex als ein parser für diese. Ich denke das beste ist einfach die traverse-string char durch char und prüfen, ob das, was Sie bekommen, passt mit dem, was Sie bekommen sollte.
Aber warum nicht mit der vorhandenen XML-Parser? Es gibt viele Möglichkeiten in der Kodierung von Daten. Viele Ausnahmen. Und wenn dein Parser nicht schafft Sie alle ist es kaum Wert, die Titel der XML-parser.
InformationsquelleAutor der Antwort GolezTrol
für und event-basierte parser muss der Benutzer zu übergeben, es einige Funktionen (
startNode(name,attrs)
endNode(name)
undsomeText(txt)
wahrscheinlich durch eine Schnittstelle) und rufen Sie Sie bei Bedarf, wie Sie gehen über die Dateidem parser wird eine while-Schleife, die abwechselnd Lesen, bis
<
und bis>
und die richtigen Umstellungen der parameter-Typenkönnen Sie bauen einen DOM-parser auf der Spitze eines event-basierte parser und die grundlegende Funktionalität, die Sie benötigen, für jeden Knoten und getParent getChildren getName und getAttributes (mit setter beim Bau 😉 )
Objekt für den dom-parser, der mit den oben beschriebenen Methoden:
bei der die Analyse enden des Stammknotens haben die Wurzel des DOM-Baumes
Hinweis: ich habe nicht, stellen Sie keine Bestätigungs-code, um sicherzustellen, Korrektheit des xml -
Bearbeiten: die Analyse der Attribute ist ein Fehler, statt der Teilung von Leerzeichen, regex ist besser für die
InformationsquelleAutor der Antwort ratchet freak
Einen parser müssen die Bedürfnisse Ihrer Eingabe Sprache. In deinem Fall, einfach XML. Das erste, was zu wissen über XML ist, es ist Kontext-frei und absolut nicht mehrdeutig, alles ist verpackt zwischen zwei Token, und das ist, was macht XML berühmt: es ist leicht zu analysieren. Schließlich, XML ist immer einfach, dargestellt durch eine Baum-Struktur. Wie bereits erwähnt, können Sie einfach analysieren, XML-und code ausführen, der in der Zwischenzeit, oder Parsen der XML, Generierung der Baum, und dann code ausführen, der nach diesem Baum.
D bietet eine sehr interessante Art zu schreiben, die ein XML-parser sehr leicht, zum Beispiel:
InformationsquelleAutor der Antwort Julio Guerra
Da D ist ziemlich eng verwandt mit Java, vielleicht Sie erzeugen einen XML-parser, mit ANTLR (da sind die meisten wahrscheinlich XML - EBNF Grammatiken für ANTLR bereits, Sie könnte verwenden Sie dann diese), und dann die Umwandlung der generierten Java-parser-code D, eine option sein könnte? Zumindest würde ihm ein Ausgangspunkt, und Sie konnte dann einige Anstrengungen in dem Versuch der Optimierung der code-speziell für D ...
Mindestens ANTLR ist gar nicht so schwer, wie viele denken scheinen. Ich hab angefangen nach dem wissen nichts über es, durch die Beobachtung von 3-4 dieses tolle set von screencasts auf ANTLR.
Btw, ich fand ANTLRWorks ein Kinderspiel, mit zu arbeiten (im Gegensatz zu der Eclipse-plugin verwendet, in dem screencast ... aber die Inhalte der screencast gilt das sowieso).
Nur meine 0.02 c.
InformationsquelleAutor der Antwort Samuel Lampa
Das erste element im Dokument sollte der prolog. Diese Zustände, die die xml-version, die Codierung, ob die Datei standalone, und vielleicht noch einige andere Sachen. Der prolog beginnt mit
<?
.Nach dem prolog, es gibt tags mit Metadaten. Die speziellen tags, wie z.B. Kommentare, DOCTYPE und element-Definitionen beginnen mit
<!
. Verarbeitungsanweisungen beginnen mit<?
. Es ist möglich, verschachtelte tags hier, wie die<!DOCTYPE
tag kann<!ELEMENT
und<!ATTLIST
tags in einer dtd Stil xml-Dokument--siehe Wikipedia für eine Gründliche Beispiel.Sollte es genau ein element der obersten Ebene. Es ist die einzige ohne
<!
oder eine<?
es vor. Es können weitere Metadaten-tags nach der top-level-element; verarbeiten der ersten.Für die explizite Analyse: Erste tags identifizieren-Sie alle beginnen mit
<
--dann bestimmen, welche Art von tag es sich handelt und was zu seiner Schließung aussieht.<!--
ist ein Kommentar-tag und kann nicht--
überall, außer für deren Ende.<?
endet mit?>
.<!
Ende mit>
. Wiederholen:<!DOCTYPE
können tags verschachtelt vor seiner Schließung, und es können weitere verschachtelte tags, die ich nicht kenne.Sobald Sie einen tag, Sie werden wollen finden, das schließende tag. Überprüfen Sie, ob das tag ist selbstschließend erste; ansonsten finden seine Schließung.
Für Datenstrukturen: ich würde empfehlen, eine Baum-Struktur, wo jedes element ist ein Knoten, und jeder Knoten hat eine indizierte/zugeordnete Liste von Unterelementen.
Offensichtlich, einen vollständigen parser wird viel mehr Forschung erfordern; ich hoffe, dies ist genug, um Ihnen den Einstieg.
InformationsquelleAutor der Antwort Mauve Ranger