Frage

Ich habe Tausende von SGML-Dokumente, einige wohlgeformt, einige nicht so gut ausgebildet sind. Ich brauche auf bestimmte Elemente in den Dokumenten zu bekommen, aber jedes Mal wenn ich zu laden gehen und versuchen, sie in ein XDocument, XMLDocument zu lesen, oder auch nur ein Stream, ich verschiedene verschiedene XMLException Fehler bekommen.

Dinge wie " '[' ist ein unerwartetes Token.". Warum? Denn ich habe ein Dokument mit DOCTYPE wie

<!DOCTYPE RChapter PUBLIC "-//LSC//DTD R Chapter for Authoring//EN" [] >

und ich habe gelernt, dass die „[]“ Bedürfnisse etwas gültig innen haben. Noch einmal, ich keine Kontrolle über die Erstellung der Dokumente, aber ich habe zu „knacken“ sie und an den Daten, die ich mag bekommen. Ein weiteres Beispiel ist mit einem „unverschlossenen“ ELEMENTE, zum Beispiel:

<Caption>Plants, and facilities<hardhyphen><hyphen>Inspection.</Caption>

Dieses XMLException ist "Der 'Bindestrich' Start-Tag auf der Linie 27 nicht das Ende-Tag von 'Caption' entsprechen. Zeile 27, Position 58." Offensichtliche, nicht wahr?

Aber dann ist die Frage, wie kann man tatsächlich auf bestimmte Elemente in diesen Dokumenten erhalten, ohne XMLExceptions zu stoßen. Ist ein SAX-Parser der richtige Weg? Ich möchte im Grunde das Dokument zu öffnen, gehen Sie nach rechts auf das Element I (ohne sich Gedanken, was könnte oder nicht wohlgeformt in der Nähe sein könnte) wollen, ziehen Sie die Daten, und ziehen weiter. Sollte ich nur vergessen, mit XMLDocument Parsen, XDocument und tun nur einfache Zeichenfolge Ersetzungen wie

str.Replace("<hardhypen><hyphen>", "-")

und dann versuchen, es in eine der XML-Parser zu laden. Irgendwelche Tipps, Strategien?

War es hilfreich?

Lösung

Das Problem ist, dass Sie versuchen, SGML mit einem XML-Tool zu analysieren. Sie sind nicht das gleiche. Wenn Sie eine XML-Tool / Sprache verwenden möchten, auf die Daten zuzugreifen, werden Sie wahrscheinlich die SGML nach XML konvertieren müssen, bevor Sie versuchen, es zu analysieren.

Im Idealfall würde man entweder eine Sprache / Werkzeug verwenden, das unterstützt SGML (wie OmniMark) oder etwas, das „XML wie“ Daten verarbeiten kann (wie nokogiri von der ersten Antwort?).

Das kann ziemlich einfach sein, kann aber an einigen Stellen knifflig. Vor allem, wenn Sie sprechen mehrere doctypes (DTDs). (Außerdem gibt es nicht so etwas wie „wohlgeformt“ SGML. Ja, die Elemente / etc. Haben verschachtelt werden korrekt aber SGML hat eine DTD haben.)

Hier sind einige Unterschiede zwischen SGML und XML, dass Sie müssen behandeln. (Sie können sich nicht diesen Weg zu gehen, aber es kann trotzdem zu Informationszwecken hilfreich sein.):

  1. DOCTYPE-Deklaration

    Die DOCTYPE-Deklaration in Ihrem Beispiel ist ein perfekt gültiges SGML Doctype. Die [] (interne Teilmenge) hat nichts drin haben. Wenn Sie Erklärungen haben in der internen Teilmenge (in der Regel Erklärungen juristische Person), sind Sie mehr als wahrscheinlich eine Doctype-Deklaration in XML zu haben, um weiterzumachen.

    Die Ausgabe der XML-Parser aufweist, ist, dass Sie nicht eine Systemkennung in der Erklärung haben. In einer XML Doctype Deklaration wird die Systemkennung erforderlich, wenn es eine öffentliche Kennung ist. In einer SGML Doctype Deklaration, es ist nicht erforderlich.

    Unterm Strich : wenn Sie die XML-Parsing zu einem DTD / Schema oder haben Deklarationen in der internen Teilmenge benötigen, Streifen die Doctype-Deklaration. Wenn die XML gültig sein muss, werden Sie zumindest Notwendigkeit, eine System-ID hinzu. Vergessen Sie nicht die <?xml ...?> Verarbeitungsanweisung hinzuzufügen.

  2. Elemente ohne End-Tags

    Die <hardhyphen> und <hyphen> Elemente gelten SGML. SGML DTDs können Sie Tag-Minimierung spezifizieren. Was dies bedeutet, ist, dass Sie, ob ein End-Tag erforderlich ist, angeben. (Sie können auch den Start-Tag optional machen, aber das ist verrückt reden.) In XML Sie diese Elemente schließen haben (wie <hardhyphen/> oder <hardhyphen></hardhyphen>)

    Das Beste, was zu tun ist, um Ihren SGML-DTD schauen und sehen, welche Elemente optional End-Tags haben. Die Tag-Minimierung wird rechts angegeben nach dem Elementnamen in der Elementdeklaration. A ‚-‘ bedeutet, dass der Tag erforderlich ist. Ein 'O' (Buchstabe 'oh') bedeutet, dass der Tag ist optional. Wenn Sie zum Beispiel sehen <!ELEMENT hyphen - o (#PCDATA)>, bedeutet dies, dass das Start-Tag erforderlich ist (-) und dem End-Tag ist optional (o). Wenn Sie <!ELEMENT hyphen - - (#PCDATA)> sehen, sowohl die Start- und die End-Tags erforderlich sind.

    Unterm Strich : richtig schließen alle Elemente, die Ende haben keine Tags

  3. Verarbeitungshinweise

    Verarbeitungshinweise (PI) in SGML haben nicht die zweite ? wenn sie geschlossen sind, wie XML tut. Sie verlassen nun die zweite ? hinzufügen müssen.

    Beispiel SGML PI: <?asdf jkl>

    Beispiel XML PI: <?asdf jkl?>

  4. enthalten /

    Sie werden wahrscheinlich nicht zu Sorgen darüber, aber in einer SGML-DTD können Sie in einer Element-Deklaration angeben, dass ein anderes Element einer beliebige Stelle innerhalb dieses Elements erlaubt ist (oder nicht erlaubt). Dies kann ein Schmerz, wenn Ihr Ziel XML-DTD analysieren muss; XML-DTD erlauben keine Einschlüsse / Ausschlüsse.

    Dies ist, was eine Aufnahme aussehen könnte:

    <!ELEMENT chapter - - (section)+ +(revst|revend)>

    Dieses sagt, dass revst oder revend sind überall innerhalb von chapter erlaubt. Wenn die Elementdeklaration -(revst|revend) hätte, wäre es, dass revst bedeuten oder revend ist nicht eine beliebige Stelle innerhalb des chapter erlaubt.

Hope, das hilft.

Andere Tipps

Ja, verwenden Sie Nokogiri .

Blättern Sie ein wenig nach unten auf dieser Seite und den Code unter „Synopsis“ kopieren in eine Datei, sagen xml-parser.rb. Dann, wenn Sie auf einem Mac (Rubin bereits auf Macs installiert kommt.), Vom Terminal laufen gem install nokogiri, und führen Sie dann die Datei mit:. ruby xml-parser.rb

Sie können auch dann irb direkt vom Terminal eingeben und dann require 'nokogiri' und beginnen mit dem nokogiri api in Echtzeit herum spielen. Gotta love interaktiven Rubin. :)

Wenn Sie unter Windows sind, versuchen Sie dieses Ruby-Installationsprogramm für Windows .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top