Wie Tabs, Linebreaks etc in XMLs ignorieren?

OP #4989988
Lesenswert?

Hallo zusammen

Ich habe hier: Beitrag "XML  HTML  CSS Interpretieren"
Nach einer Möglichkeit zum parsen eines HTML gefragt.

Inzwischen habe ich erkannt, dass es wohl effizienter ist, wenn ich 
einfach eine eigene Struktur in Form eines XMLs voraussetze anstelle 
einen HTML Parser zu schreiben.

Ich bin nun auf yXML gestossen und bin dabei ein paar Versuche damit in 
Visual Studio Express durchzuführen.

Anbei das erste ergebnis.

Grundsätzlich funktioniert es ganz gut.
Ich habe einfach ein Problem.
In meinem XML File gibt es zwecks lesbarkeit, einige Tabstopps uns 
Linebreaks. Diese werden leider von yXML als content interpretiert.

Nun dachte ich zuerst daran, einfach alle Linebreaks und Tabs zu 
entfernen.
Was aber, wenn in einem Text tatsächlich ein Linebreak gewünscht ist?

Ich konnte bisher keinen vernünftigen Ansatz finden, das Problem elegant 
und sauber zu lösen.

Deshalb hoffe ich auf ein paar Ideen von der Community.

Danke schonmal.
Angehängte Dateien:
#4990036
Lesenswert?

Holger K. schrieb:
> In meinem XML File gibt es zwecks lesbarkeit, einige Tabstopps uns
> Linebreaks. Diese werden leider von yXML als content interpretiert.

yXML ist ein nicht-validierender Parser, d.h., es überprüft nicht die 
korrekte Reihenfolge der Elemente. Deshalb weiß es auch nicht, an 
welchen Stellen Text erlaubt ist, und kann also überflüssigen Text nicht 
entfernen.

Wenn du nicht auf einen anderen Parser umsteigen willst, dann musst du 
dir merken, in welchem Element du gerade bist (dafür brauchst du einen 
Stack der Element-Namen oder -Typen), und davon abhängig Text 
ignorieren.
OP #4990046
Lesenswert?

Clemens L. schrieb:
> Holger K. schrieb:
>> In meinem XML File gibt es zwecks lesbarkeit, einige Tabstopps uns
>> Linebreaks. Diese werden leider von yXML als content interpretiert.
>
> yXML ist ein nicht-validierender Parser, d.h., es überprüft nicht die
> korrekte Reihenfolge der Elemente. Deshalb weiß es auch nicht, an
> welchen Stellen Text erlaubt ist, und kann also überflüssigen Text nicht
> entfernen.
>
> Wenn du nicht auf einen anderen Parser umsteigen willst, dann musst du
> dir merken, in welchem Element du gerade bist (dafür brauchst du einen
> Stack der Element-Namen oder -Typen), und davon abhängig Text
> ignorieren.

Danke für deine Antwort.

Dann sollte ich mir wohl doch lieber den sxmlc ansehen.
Gast #4990053
Lesenswert?

Clemens L. schrieb:
> yXML ist ein nicht-validierender Parser, d.h., es überprüft nicht die
> korrekte Reihenfolge der Elemente. Deshalb weiß es auch nicht, an
> welchen Stellen Text erlaubt ist, und kann also überflüssigen Text nicht
> entfernen.

naja ohne xsd kann das kein Parser. Man ist ja immer innerhalb eines 
Elementes.
#4990231
Lesenswert?

Holger K. schrieb:
> Inzwischen habe ich erkannt, dass es wohl effizienter ist, wenn ich
> einfach eine eigene Struktur in Form eines XMLs voraussetze anstelle
> einen HTML Parser zu schreiben.

Es ist sogar deutlich effizienter, wenn du eine eigene Struktur in JSON 
voraussetzen kannst. Man kann ohne weitere Probleme korrekte und 
wohlformatierte XML-Dokumente erstellen, die mehrere GB RAM zum Parsen 
benötigen.

Schaue dich mal jenseits von HTML und XML um.

Nachtrag: Aus einer JSON-Beschreibung eine HTML-Seite (mit CSS) zu 
machen ist einfacher als umgekehrt. Dein Problem ist mir nicht ganz 
klar, aber evtl. wäre das sinnvoller.
#4990860
Lesenswert?

Noch einer schrieb:
> Die überflüssigen Whitespace entfernt der Xml-Parser.

Warum schreibst du das, wenn im ersten Beitrag gezeigt wird, dass der 
Parser es eben nicht macht?

> Genau dafür gibt es die Attribute xml:space="preserve" und
> xml:space="default" im XML-Standard.

Die XML-Spezifikation (https://www.w3.org/TR/xml/#sec-white-space) sagt:
> An XML processor MUST always pass all characters in a document that
> are not markup through to the application.

Das ist, was yXML macht.

> A validating XML processor MUST also inform the application which
> of these characters constitute white space appearing in element
> content.

yXML ist aber kein validierender XML-Prozessor.

> A special attribute named xml:space may be attached to an element to
> signal an intention that in that element, white space should be
> preserved by applications.

Und "signal an intention" heißt, dass man sich nicht unbedingt dran 
halten muss. (Und xml:space="preserve" ist hier eh' nicht gewünscht.)
Gast #4991132
Lesenswert?

> (Und xml:space="preserve" ist hier eh' nicht gewünscht.)

Nanu? Hab es so verstanden: Der Parser soll mit xml:space="default" 
anfangen. Innerhalb von <label> soll er auf xml:space="preserve" 
umschalten.

Stimmt das so?

>yXML ist aber kein validierender XML-Prozessor.

Es gibt keinen kleinen in C geschriebenen non-validating XML parser, der 
xml:space berücksichtigt?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren