Codierungsdeklaration von XML-Dateien

Fragen und Bugreports zur PureBasic 4.0-Beta.
Little John

Codierungsdeklaration von XML-Dateien

Beitrag von Little John »

Hallo zusammen!

Wenn mein PB-Programm z.B. folgende XML-Datei verarbeiten soll ...

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<base>
<Erna>Hans</Erna>
<Herbert>Hilde</Herbert>
<Dieter>Trude</Dieter>
</base>
... wie komme ich dann an den Wert des encoding-Attributes?

Ich habe es so versucht (mit PureBasic 4.10 Beta 3 für Windows):

Code: Alles auswählen

xml = LoadXML(#PB_Any, fileName)
*node = RootXMLNode(Xml)
Debug GetXMLAttribute(*node, "encoding")
Die letzte Codezeile bewirkt aber folgenden Fehler:

Code: Alles auswählen

[ERROR] This type of XML node cannot have attributes.
Gut, also vielleicht ist das XML-technisch gesehen kein Attribut, aber wie
komme ich an die Information die in diesem Fall ISO-8859-1 lautet?

TIA, Little John
Zuletzt geändert von Little John am 28.08.2007 20:24, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Encoding-Attribut von XML-Dateien

Beitrag von Kiffi »

Code: Alles auswählen

Result = GetXMLEncoding(#XML)
Alles weitere: Siehe PB-Hilfe ;-)

Grüße ... Kiffi
Hygge
Little John

Re: Encoding-Attribut von XML-Dateien

Beitrag von Little John »

Kiffi hat geschrieben:

Code: Alles auswählen

Result = GetXMLEncoding(#XML)
Danke für die Antwort.
Über GetXMLEncoding() hatte ich schon in der Hilfe gelesen, aber das liefert eine Zahl -- bei mir in diesem Fall 3 --, jedoch nicht die Information die ich wissen möchte (s.o.).

Gruß, Little John
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Encoding-Attribut von XML-Dateien

Beitrag von Kiffi »

Little John hat geschrieben:aber das liefert eine Zahl
... welche für eine der nachfolgenden Konstanten steht:
PB-Hilfe hat geschrieben:Returns either #PB_Ascii, #PB_Unicode (= UTF16) or #PB_UTF8.
in Deinem Fall also #PB_Ascii.

Grüße ... Kiffi
Hygge
Little John

Re: Encoding-Attribut von XML-Dateien

Beitrag von Little John »

Kiffi hat geschrieben:
Little John hat geschrieben:aber das liefert eine Zahl
... welche für eine der nachfolgenden Konstanten steht:
PB-Hilfe hat geschrieben:Returns either #PB_Ascii, #PB_Unicode (= UTF16) or #PB_UTF8.
in Deinem Fall also #PB_Ascii.
Richtig, aber das war nicht meine Frage. Ich möchte wissen, was in einer gegebenen XML-Datei hinter encoding= steht. ( Das muss ja nicht zwangsläufig ISO-8859-1 sein, sondern dort können durchaus auch andere Angaben stehen. )

Gruß, Little John
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von NicTheQuick »

Notfalls parst du die erste Zeile selbst.
Bild
Little John

Beitrag von Little John »

NicTheQuick hat geschrieben:Notfalls parst du die erste Zeile selbst.
Ja ... notfalls.
Aber bevor ich das tue, wollte ich halt hier fragen ob ich da was übersehen habe, und jemand eine Lösung mit Hilfe der XML-Routinen von PB kennt.

Falls das mit PB zur Zeit nicht möglich ist, dann ist das ein Wunsch/Verbesserungsvorschlag: Hinzufügen einer Funktion sagen wir XMLDocumentEncoding, die z.B. in meinem Beispiel im Ursprungsposting die Zeichenkette ISO-8859-1liefern würde.

Gruß, Little John
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Die XML lib unterstützt nur folgende Encodings:

US-ASCII
ISO-8859-1
UTF-8
UTF-16

US-ASCII wird mit ISO-8859-1 in einen Topf geworfen, weil das eine das andere beinhaltet.
Get/SetXMLEncoding() deckt also mit #PB_Ascii, #PB_UTF8 und #PB_Unicode
das Spektrum der unterstützten Encodings ab.

Die XML Spezifikation schreibt nur vor das UTF-8 und UTF-16 unterstützt werden
müssen. Alle anderen Encodings sind optional. Desshalb erschien es uns nicht
sinnvoll die Lib unnötig mit extra Encodings aufzublasen (da gibt es ja massig davon),
vorallem da UTF-8 sich sowiso immer mehr durchsetzt.

Man kann allerdings mehr Encodings parsen indem man den Expat parser
direkt verwendet. Dort gibt es die Möglichkeit durch einen Callback andere
Encodings zu handhaben.
Little John

Beitrag von Little John »

Hallo freak,

danke für die ausführliche Antwort. Ich verstehe, dass Ihr den Umfang der XML-Library und den Aufwand dafür in gewissen Grenzen halten wollt. Und Deinen folgenden Ausführungen
Die XML Spezifikation schreibt nur vor das UTF-8 und UTF-16 unterstützt werden
müssen. Alle anderen Encodings sind optional. Desshalb erschien es uns nicht
sinnvoll die Lib unnötig mit extra Encodings aufzublasen (da gibt es ja massig davon),
vorallem da UTF-8 sich sowiso immer mehr durchsetzt.
stimme ich zu.

In Bezug auf CreateXML() sind das auch gute Argumente, da würde ich auch nicht soviel "altmodischen Krimskrams" unterstützen.
Nur für das Lesen von XML-Dateien sieht die Situation ja anders aus. Ich kann ja weder beeinflussen noch vorher wissen, welche Codierungsdeklaration irgendein Autor für seine XML-Datei verwendet. Wenn's UTF-8 oder UTF-16 ist, dann sagt PureBasic mir das eindeutig, OK. Aber wenn GetXMLEncoding() mir #PB_Ascii liefert, dann können sich -- wie Du ja auch schreibst -- alle möglichen Kodierungen dahinter verbergen. Warum wird mir die exakte Information vorenthalten?

Man braucht ja nicht jede der vielen möglichen Kodiereungen einzeln zu "unterstützen". Es reicht doch eine kleine Funktion, die einfach den String liefert, der hinter encoding= steht. Damit sind dann automatisch alle Möglichkeiten abgedeckt. Biiiiiiiiiitte! :)
Man kann allerdings mehr Encodings parsen indem man den Expat parser direkt verwendet. Dort gibt es die Möglichkeit durch einen Callback andere Encodings zu handhaben.
Ihr habt ja in der Hilfe zu XML auch erwähnt, dass man mit der Library mehr machen kann als das, was von PureBasic direkt unterstützt wird. Daraufhin habe ich mir Expat heruntergeladen und in der Dokumentation nachgelesen. Ich habe nur leider kaum ein Wort verstanden ...
Ich könnte selbst nicht solch einen Callback programmieren. Und ich benutze ganz absichtlich leicht zu verstehende und zu hanhabende Sprachen wie PureBasic, weil ich Werkzeuge brauche die für mich Teil der Lösung sind und nicht Teil des Problems. :)

Beste Grüße, Little John
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Laut XML Spezifikation ist es ein kritischer Fehler wenn der Parser die Kodierung
des Dokumentes nicht versteht. D.h. der Parser muss dann mit einem Fehler abbrechen.
Expat hält sich daran, d.h. ein Dokument mit einem anderen als den oben genannten
Encodings wird direkt einen Fehler produzieren und garnicht angenommen.
Da kann ich gar nichts dran ändern.

Die einzige Möglichkeit dies zu ändern ist indem man dem Parser explizit
die benötigten Encodings beibringt.
Gesperrt