Wie analysiere ich eine DTD-Datei in Ruby?

8

Ich habe versucht, eine DTD-Datei in eine YAML-Datei zu konvertieren, und ich habe versucht, es sowohl in LibXML und Nokogiri zu laden, aber es scheint, dass eine DTD-Datei keine gültige XML-Datei ist. Es ist mir gut, Edelsteine ​​von Drittanbietern zu verwenden, solange ich die DTD-Datei parsen kann.

Mein Versuch der Konvertierung:

%Vor%

Jeder Online-XML-Validator gibt auch den Fehler "Start tag expected" zurück. Ich gehe davon aus, dass alle gültigen XML-Dokumente mit <?xml beginnen, die DTD-Dateien zu fehlen scheinen. Dies hat mich zu der Schlussfolgerung geführt, dass alle DTD-Dateien ungültige XML-Dateien sind. Es fühlt sich jedoch komisch an, dass die XML-Definitionssyntax selbst nicht als gültiges XML definiert wurde. Warum?

Ich analysiere die DTD-Datei, um ungültige Attribute aus einer XML-Datei zu entfernen, um zu wissen, welche Attribute beibehalten und welche entfernt werden sollen. Daher muss ich die DTD-Datei parsen.

Und letztendlich ist dies alles nur ein Schritt, um HTML in ENML (Evernote Markup Language) zu konvertieren. Die darin enthaltenen Schritte umfassen:

  • Konvertieren von HTML in gültiges XHTML
  • Umwandlung des Körpers in ein Element mit der Bezeichnung "note"
  • Entfernen von ungültigen Tags und Attributen gemäß der dtd-Datei
  • Validierung der enml-Datei gegen die dtd

Ich denke gerade daran, die nicht erlaubten Attribute und Tags aus " Grundlegendes zur Evernote Markup Language zu kopieren > "und verwende das, um mein XHTML zu validieren, aber ich würde lieber die DTD als meine Quelle verwenden.

Die Nokokiri-DTD-Klasse ist eine Knotenklasse, um einen Inline-DTD-Knoten zu halten und gegen ihn zu validieren. In meinem Fall habe ich eine externe DTD-Datei mit dem SYSTEM-Attribut angegeben, die Nokogiri anscheinend nicht unterstützt . Und selbst wenn es funktionieren würde, wäre alles, was ich bekommen würde, die Validierung.

Ich habe die Validierung erhalten, um richtig zu funktionieren mit:

%Vor%

Ich habe REXML nicht ausprobiert. Ich werde es versuchen und melden.

Ich versuche, ein HTML-Dokument in ein XML-Dokument zu konvertieren, das mit der gegebenen DTD validiert. Die meisten HTML-Elemente und -Attribute sind im ENML-Schema nicht zulässig, daher muss ich sie entfernen oder entfernen. Ich muss auch wissen, welche Attribute erlaubt sind und welche nicht, so dass ich das XML richtig analysieren kann und die störenden Elemente und Attribute entfernen / bereinigen kann.

Für den Zweck der Reinigung verwende ich Lufah , aber um es zu benutzen, brauche ich eine Liste von tag- & gt; Attribute (welche Attribute sind für jedes Tag verfügbar). Anstatt mehrere Durchgänge zu machen, die das Dokument validieren, was ich am Ende der Bereinigung mache, durchforste ich einfach jedes XML-Tag und säubere es. Aber um zu wissen, wie man sie bereinigen kann, muss ich wissen, welche Tags und Elemente im gültigen Schema unterstützt werden. Daher muss ich die DTD-Datei analysieren.

Soweit ich weiß, ist XLST das richtige Werkzeug für den Job, aber ich fühle mich nicht wohl genug, es zu benutzen.

    
Nemo 12.07.2014, 16:31
quelle

1 Antwort

2
  

Es fühlt sich jedoch komisch an, dass die XML-Definitionssyntax selbst nicht als gültiges XML definiert wurde. Ich würde gerne irgendwelche Gründe dafür wissen.

DTDs sind ein Überbleibsel von SGML, dem Vorgänger von XML, daher ist es eigentlich nicht sonderlich komisch, dass DTDs keine XML-Dateien sind. Es war eine bewusste Entscheidung, DTDs und ihre spezielle Syntax zu behalten, als XML erstellt wurde.

Modernere Schemasprachen wie W3C XML Schema und RELAX NG verwenden XML-Syntax.

  

Der Grund für das Parsen der DTD-Datei ist, dass ich ungültige Attribute aus einer XML-Datei entfernen möchte. Um zu wissen, welche Attribute zu behalten und welche zu entfernen, brauche ich eine Möglichkeit, die DTD-Datei zu analysieren. (aus Frage)

     

Ich bin nur auf der Suche nach einer Möglichkeit, DTD-Dateien zu analysieren, nicht nur mit ihnen zu validieren, weil ich benutzerdefinierte Bereinigung und Validierung mithilfe der dtd. (aus Kopftext)

durchführen möchten

Ich verstehe nicht wirklich, was Sie mit "benutzerdefinierter Bereinigung" meinen. Ich sehe auch nicht den Sinn darin, die DTD überhaupt zu parsen.

Um herauszufinden, ob Elemente oder Attribute in einer XML-Datei ungültig sind (wenn sie die Regeln in einer zugehörigen DTD verletzen), müssen Sie die XML-Datei mit einem validierenden XML-Parser analysieren . Der Parser wird Ihnen dann mitteilen, ob Fehler vorliegen, die behoben werden müssen.

Nokogiri basiert auf libxml2, das einen validierenden Parser bereitstellt. Es unterstützt externe DTDs, die mit der <!DOCTYPE foo SYSTEM "bar.dtd"> -Syntax angegeben werden (wie diese Arbeit in einem Kommentar zu dem Problem angezeigt wird, auf das Sie verweisen: Ссылка ).

Hier ist, wie die Validierung durchgeführt werden kann:

%Vor%

Wenn dieser Code nicht ausgegeben wird, ist das XML-Dokument für die DTD gültig.

    
mzjn 08.08.2014 15:40
quelle

Tags und Links