Hallo,
einige von euch kennen sich sicher mit XML-Sachen aus. Ich habe ein Schema mit einer enumaration (Privatkunde,Geschäftskunde) und erzeuge ein passendes File mit dem Xerces-Parser.
my $newNode = $doc->createElement ($name); my $newTextNode = $doc->createTextNode ($value); $newNode->appendChild ($newTextNode);
Das bringt: <Kundenklasse>Geschäftskunde</Kundenklasse> im vi und im less. Wenn ich das File wieder einlesen will spuckt der Parser eine Fehlermeldung:
MESSAGE: Datatype error: Type:InvalidDatatypeValueException, Message:Value 'Gesch㥴skunde' is not in enumeration .
hmm. XML-SPY meckert auch rum. Ich bin der Meinung, dass die Sonderzeichen beim createTextNode() richtig konvertiert werden und ich mich darum nicht kümmern muss. Irgendwas wird ja auch encoded, kann aber nicht mehr richtig gelesen werden. Prima klappt es mit normalen Nodes, nur eben nicht mit der Enumeration. Was muss ich im Schema angeben, damit alles wieder stimmig ist?
Mit freundlichen Grüßen
Jens Puruckherr
On Wed, Aug 20, 2003 at 02:23:13PM +0200, Jens Puruckherr wrote:
Hallo,
Hi Jens,
einige von euch kennen sich sicher mit XML-Sachen aus. Ich habe ein Schema mit einer enumaration (Privatkunde,Geschäftskunde) und erzeuge ein passendes File mit dem Xerces-Parser.
my $newNode = $doc->createElement ($name); my $newTextNode = $doc->createTextNode ($value); $newNode->appendChild ($newTextNode);
Das bringt: <Kundenklasse>Geschäftskunde</Kundenklasse>
Dürfen in XML-Dateien wirklich Umlaute auftreten? Müssen diese nicht schon codiert drinnstehen (z.B. ä für 'ä')?
MESSAGE: Datatype error: Type:InvalidDatatypeValueException, Message:Value 'Gesch�skunde' is not in enumeration .
Hmm, hier wurde der Umlaut zweimal in UTF8 umkodiert...
Ciao, Tobias
Tobias Koenig wrote:
Hi Jens,
Hallo,
einige von euch kennen sich sicher mit XML-Sachen aus. Ich habe ein Schema mit einer enumaration (Privatkunde,Geschäftskunde) und erzeuge ein passendes File mit dem Xerces-Parser.
my $newNode = $doc->createElement ($name); my $newTextNode = $doc->createTextNode ($value); $newNode->appendChild ($newTextNode);
Das bringt: <Kundenklasse>Geschäftskunde</Kundenklasse>
Dürfen in XML-Dateien wirklich Umlaute auftreten? Müssen diese nicht schon codiert drinnstehen (z.B. ä für 'ä')?
Welche Zeichen in einer XML-Datei stehen duerfen und wie diese interpretiert werden, haengt vom Encoding ab, das ist standardmaessig UTF-8. Die Entity ä ist nur bei entsprechender DTD/Schema moeglich, z.B. bei HTML. XML selbst kennt nur sehr wenige Entities.
MESSAGE: Datatype error: Type:InvalidDatatypeValueException, Message:Value 'Gesch�skunde' is not in enumeration .
Hmm, hier wurde der Umlaut zweimal in UTF8 umkodiert...
Vielleicht vergessen in der XML-Processing Instruction das Encoding anzugeben, oder ein falsches angegeben ? (oder gar vergessen ?)
Jens: Wir brauchen die relevanten Teile deiner XML-Datei und deines Schemas um das genaueres zu sagen.
Ciao, Tobias
Jens
lug-dd@schlittermann.de writes:
Welche Zeichen in einer XML-Datei stehen duerfen und wie diese interpretiert werden, haengt vom Encoding ab, das ist standardmaessig UTF-8. Die Entity ä ist nur bei entsprechender DTD/Schema moeglich, z.B. bei HTML. XML selbst kennt nur sehr wenige Entities.
MESSAGE: Datatype error: Type:InvalidDatatypeValueException, Message:Value 'Gesch�skunde' is not in enumeration .
Hmm, hier wurde der Umlaut zweimal in UTF8 umkodiert...
Vielleicht vergessen in der XML-Processing Instruction das Encoding anzugeben, oder ein falsches angegeben ? (oder gar vergessen ?)
Ich habe zunächst gar nix angegeben.Spuckte schön utf8 aus. Da hatte ich aber noch keine Umlaute drinn (zufällig) Neuerdings wird utf16 ausgespuckt, was mir eher zufällig auffiel. Es wird nirgendwo ein encoding gesetzt, scheint alles elektrisch zu gehen ... Nach ein wenig forschen habe ich gemerkt, dass generell alle Umlaute dieses Problem haben, hat nix mit Enumeration zu tun....
Jens: Wir brauchen die relevanten Teile deiner XML-Datei und deines Schemas um das genaueres zu sagen.
Was genau?
Stückel Schema:
<?xml version="1.0" encoding="UTF-16"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="Personenliste"> .... <xs:element name="Kundenklasse"> xs:annotation xs:documentationPrivat- oder Geschäftskunde</xs:documentation> </xs:annotation> xs:simpleType <xs:restriction base="xs:string"> <xs:enumeration value="Privatkunde"/> <xs:enumeration value="Geschäftskunde"/> </xs:restriction> </xs:simpleType> </xs:element>
.....
Stückel XML:
<?xml version="1.0" encoding="UTF-16" standalone="no" ?> <Personenliste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://intern.cyberport.de/intranet/specials/schemas/person.xsd">
.....
<Kundenklasse>Geschäftskunde</Kundenklasse> ...
in XMLSPY: <Kundenklasse>Gesch?skunde</Kundenklasse>
Muss ich jedes Stückerll Text vom einfügen in das XML-File irgendwie UTF-encoden? Ich habs schon mal versucht, aber dabei kam wohl das Doppelencoduíng zustande ...
Mit freundlichen Grüßen
Jens Puruckherr
Jens Puruckherr wrote:
Hallo Jens,
Welche Zeichen in einer XML-Datei stehen duerfen und wie diese interpretiert werden, haengt vom Encoding ab, das ist standardmaessig UTF-8. Die Entity ä ist nur bei entsprechender DTD/Schema moeglich, z.B. bei HTML. XML selbst kennt nur sehr wenige Entities.
MESSAGE: Datatype error: Type:InvalidDatatypeValueException, Message:Value 'Gesch�skunde' is not in enumeration .
Hmm, hier wurde der Umlaut zweimal in UTF8 umkodiert...
Vielleicht vergessen in der XML-Processing Instruction das Encoding anzugeben, oder ein falsches angegeben ? (oder gar vergessen ?)
Ich habe zunächst gar nix angegeben.Spuckte schön utf8 aus. Da hatte ich aber noch keine Umlaute drinn (zufällig) Neuerdings wird utf16 ausgespuckt, was mir eher zufällig auffiel. Es wird nirgendwo ein encoding gesetzt, scheint alles elektrisch zu gehen ... Nach ein wenig forschen habe ich gemerkt, dass generell alle Umlaute dieses Problem haben, hat nix mit Enumeration zu tun....
Jens: Wir brauchen die relevanten Teile deiner XML-Datei und deines Schemas um das genaueres zu sagen.
Was genau?
Stückel Schema:
<?xml version="1.0" encoding="UTF-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="Personenliste"> .... <xs:element name="Kundenklasse"> xs:annotation xs:documentationPrivat- oder Geschäftskunde</xs:documentation> </xs:annotation> xs:simpleType <xs:restriction base="xs:string"> <xs:enumeration value="Privatkunde"/> <xs:enumeration value="Geschäftskunde"/>
Ich hoffe, das Schema ist auch in UTF-16, wie du es oben schreibst ???
Sowas geht uebrigens gut mit jEdit, der zeigt das Encoding des Textes an und du kannst das auch umstellen, und so einen Text umwandeln.
</xs:restriction> </xs:simpleType>
</xs:element>
.....
Stückel XML:
<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
<Personenliste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://intern.cyberport.de/intranet/specials/schemas/person.xsd">
.....
<Kundenklasse>Geschäftskunde</Kundenklasse> ...
Gleiche Frage wie oben: Ist die Datei auch UTF-16, wie angegeben ? Nicht das du fleissig UTF-16 reinschreibst, aber deine Zeichen ISO-8859-1 sind.
in XMLSPY: <Kundenklasse>Gesch?skunde</Kundenklasse>
Da stimmt schon was nicht.
Muss ich jedes Stückerll Text vom einfügen in das XML-File irgendwie UTF-encoden?
Wenn du einen normalen Text-Editor nimmst, ja. Der kann ja nur ISO-8859-1, da musst du also aus deinen Umlauten erst die ISO-8859-1 Zeichen machen, die als UTF-16 interpretiert das Zeichen ergeben, das du haben willst. Das geht aber nicht immer und macht dir unnoetig Arbeit. Da alles XML-Werkzeuge mindestens ISO-8859-1, UTF-8 und UTF-16 unterstuetzten sollten, kannst du auch einfach in ISO-8859-1 schreiben. Alternativ suchst du dir einen Editor, der im Encoding deiner Wahl speichern kann. Ich habe mit jEdit und XML gute Erfahrungen gemacht.
Ich habs schon mal versucht, aber dabei kam wohl das Doppelencoduíng zustande ...
Mit freundlichen Grüßen
Jens Puruckherr
Deine restlichen Versuche deuten auch alle darauf hin, dass du ganz kraeftig mit Encoding-Problemen kaempfst ... Da hilft nur eines: Jedes einzelne Stueck Text anschauen und feststellen, ob das was als Zeichen drin stehen soll, auch mit dem richtigen Encoding (sprich Bitmuster) drinsteht.
MfG
Jens
lug-dd@schlittermann.de writes:
Ich hoffe, das Schema ist auch in UTF-16, wie du es oben schreibst ???
Das Schema wurde mit XML-Spy erzeugt, dieses weisst das Schema selbständig als UFT-16 aus. Ich gehe mal davon aus, dass es so seine Richtigkeit hat. Wenn ich per Hand das encoding auf utf-8 setze ändert sich aber nix.
Sowas geht uebrigens gut mit jEdit, der zeigt das Encoding des Textes an und du kannst das auch umstellen, und so einen Text umwandeln.
Schaue ich mir mal an.
Gleiche Frage wie oben: Ist die Datei auch UTF-16, wie angegeben ?
Ich erzeuge das XML via Xerces durch hinzufügen von Nodes, wie in http://xml.apache.org/xerces-p/domcreate.html beschrieben. Die Daten selber kommen aus einer mysql-DB. Ich gebe kein Encoding an. Versuche mit Encoding fest auf UTF-8 gesetzt, ergaben zwar, dass der Parser auch brav sagte, das File ist utf-8, aber beim writeToString des Files steht dann ein utf-16 drinne :-( Beim Einlesen meint der Parser aber, utf-16 isses nicht und stolpert dann über den Geschx!?__&&&!tskunden... ;-)
Nicht das du fleissig UTF-16 reinschreibst, aber deine Zeichen ISO-8859-1 sind.
Die Zeichen werden automatisch in irgendwass konvertiert. Der vi erkennt das Encoding und stellt die Zeichen dann wieder richtig dar .. Da kann ich nicht viel sehen.
in XMLSPY: <Kundenklasse>Gesch?skunde</Kundenklasse>
Da stimmt schon was nicht.
Naja, das ist kein Fragezeichen, sondern irgendwas anderes, was durch C&P in den Mailclient verstümmel wird.
Wenn du einen normalen Text-Editor nimmst, ja. Der kann ja nur ISO-8859-1, da musst du also aus deinen Umlauten erst die ISO-8859-1 Zeichen machen, die als UTF-16 interpretiert das Zeichen ergeben, das du haben willst. Das geht aber nicht immer und macht dir unnoetig Arbeit. Da alles XML-Werkzeuge mindestens ISO-8859-1, UTF-8 und UTF-16 unterstuetzten sollten, kannst du auch einfach in ISO-8859-1 schreiben. Alternativ suchst du dir einen Editor, der im Encoding deiner Wahl speichern kann. Ich habe mit jEdit und XML gute Erfahrungen gemacht.
wie gesagt, das XML wird via Xerces generiert, nix Editor.
Deine restlichen Versuche deuten auch alle darauf hin, dass du ganz kraeftig mit Encoding-Problemen kaempfst ... Da hilft nur eines: Jedes einzelne Stueck Text anschauen und feststellen, ob das was als Zeichen drin stehen soll, auch mit dem richtigen Encoding (sprich Bitmuster) drinsteht.
Au weia - riecht nach Arbeit ... naja.
Mit freundlichen Grüßen
Jens Puruckherr
So, das Problem scheint sich bene geklärt zu haben: Meine ganzen Verwirrungen kommen anscheinend daher, dass folgende Dinge erwas komplett unterschiedliches machen:
return $writer->writeNode($target,$xmldoc); -> schreibt alles richtig nach $target
return $writer->writeToString($xmldoc); -> schreibt alles faslch in einen String
Und genau den writeToString habe ich verwendet. Jetzt weiss ich zwar, wo der Fehler ist, aber immer noch nicht wie ich mein XML gscheit Serialisiere ..
Mit freundlichen Grüßen
Jens Puruckherr
lug-dd@schlittermann.de writes:
Vielleicht vergessen in der XML-Processing Instruction das Encoding anzugeben, oder ein falsches angegeben ? (oder gar vergessen ?)
Ich habe noch bissel experimentiert:
Mein Parserr erzeugt von sch aus immer utf-16 - warum auch immer. Ein Testscript ohne encoding-Angabe macht utf-8 und hat auch die Umlaute passend encoded. encodung iso-8859-1 liess die Umlaute in Ruhe. ein ä bleibt ein ä.
Also gehe ich mal davon aus, dass er Parser beim Erzeugen des Files sich selber um das Encoden kümmert. Entweder nimmt er sich das, was zum Inhalt passt, oder er lässt sich eines aufzwingen. Sehe ich das richtig so?
Mit freundlichen Grüßen
Jens Puruckherr
Ich habe die Encoding-Versuche nun am echten-Script versucht vorzunehmen und erhalte ein anderes Ergebnis:
Das Encoding lässt sich per Hand auf utf-8 setzen, am Ende hat das Dokument auch noch utf-8 ($doc->getEncoding), geschrieben wird aber:
<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
Beim Wiedereintritt werde ich angemeckert:
MESSAGE: Encoding (UTF-16, from XMLDecl or manually set) contradicts the auto-sensed encoding, ignoring it
OK, großzügiges Angebot, aber dann wieder
MESSAGE: Datatype error: Type:InvalidDatatypeValueException, Message:Value 'Gesch㥴skunde' is not in enumeration .
In meinem Schema steht: <?xml version="1.0" encoding="utf-8"?> .... <xs:element name="Kundenklasse"> xs:annotation xs:documentationPrivat- oder Geschäftskunde</xs:documentation> </xs:annotation> xs:simpleType <xs:restriction base="xs:string"> <xs:enumeration value="Privatkunde"/> <xs:enumeration value="Geschäftskunde"/> </xs:restriction> </xs:simpleType> </xs:element>
OK, klar, das ist nicht das selbe. Aber wie zum Geier bekommen ich es hin, dass der Geschäftskunde entsprechend geschreiben wird ?? Nebenbei steckt noch mein Name mit im XML:
im VI: <Name>Pürückherr</Name> In XML-SPY: <Name>P?err</Name> Der Parser meckert diesmal nich ;-)
Lese ich den Datensatz wieder, ein mache ich zur Kontrolle: print STDERR "Name: ". from_utf8({ -string =>$Adresse->name,-charset => 'ISO-8859-1' }) ."\n"; print STDERR "Name: ". $Adresse->name ."\n"; und erhalte: Name: Perr Name: Perr
Ist das nicht zum Heulen?
Ich könnte jetzt einfach das Encoding überall auf 8859-1 stellen und wäre die Sorgen los, aber utf-8 soll ja mitllerweile standard fpr xml sein, und ich weiss ja nicht, mit wem ich mal Files tauschen muss...
Mit freundlichen Grüßen
Jens Puruckherr
lug-dd@mailman.schlittermann.de