XML und &

Status
Nicht offen für weitere Antworten.

max5432

Aktives Mitglied
Hallo

Ich möchte in ein XML-Dokument z.B. Unicodewerte 1569, 1574 usw. (decimal) schreiben:

ءئ

Das Schreiben in die Datei wird in einer Methode durchgeführt.

[HIGHLIGHT="Java"]
String str = "&#" + getCode() + ";";
// Methode getCode liefert z.B. den Unicodewert für divese Zeichen.
[/HIGHLIGHT]

Mein Problem ist, dass ich in der XML-Datei danach folgendes habe:

ءئ

Bei der Interpretierung zeigt der Browser einfach das:

ءئ

Wenn ich in der XML-Datei anstatt & das Zeichen & schreibe, funktioniert die Anzeige.

Wie kann ich in die XML-Datei das Zeichen & schreiben, ohne das es durch & ersetzt wird? Oder, wie schreibt man Unicodewerte (decimal) in eine XML-Datei so, dass die Zeichen danach von einem Browser korrekt interpretiert werden?

Danke für jeden Tipp.
 

max5432

Aktives Mitglied
Wie schreibst Du die XML-Datei denn? Mit java.io.*-Mitteln? Oder mit einer XML-Library?

Ich arbeite mit Library (JDOM) und erzeuge Element für Element. Wenn das ganze noch im Speicher ist, ist alle in Ordnung. Jedoch nachdem folgende Zeilen abgearbeitet werden

[HIGHLIGHT="Java"]

XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
FileOutputStream output = new FileOutputStream(xmlFilename);
outputter.output(doc, output);
[/HIGHLIGHT]

findet diese Umwandlung offenbar statt (Entity).
 

max5432

Aktives Mitglied
Aus der JDOM-FAQ:
http://www.jdom.org/docs/faq.html#a0290

Also besser direkt den Unicode in das Element packen und das Umwandeln dem Outputter überlassen.

Probiert!

Wenn ich Schreibe
[HIGHLIGHT="Java"]
String str = "\u0042\0042\u0043";
element.setText(str);
[/HIGHLIGHT]

funktioniert es gut.

Nun, das Zusammensetzten des Strings, den ich am Schluss der Methode setText übergeben, mache ich in einer anderen Methode. So nehme ich aus dem übergebenen String Zeichen für Zeichen, hole mir den Unicode (0041, 0042 bzw. 0043) und probire danach, den String zusammenzustzen, bevor ich es zurück geben.

[HIGHLIGHT="Java"]

String a = "0041"; // für A
String b = "0042"; // für B
String c = "0043"; // für C
String str = new String("\\u" + a + "\\u" + b + "\\u" + c);

return str;
[/HIGHLIGHT]

Und, dies funktioniert eben nicht. Wie sollte man so was machen? Denn, [HIGHLIGHT="Java"]
String str = "\u" + a; // usw.
[/HIGHLIGHT]

kann ich nicht machen. Wie setzt man einen String zusammen, indem dem Konstruktor die Unocode-Werte einzelner Zeichen eines bestehenden Strings übergeben werden?
 

Murray

Top Contributor
Etwa so:
[highlight=Java]int a = 0x0041; // für A
int b = 0x0042; // für B
int c = 0x0043; // für C

String str = new String( Character.toChars( a)) +
new String( Character.toChars( b)) +
new String( Character.toChars( c));[/highlight]
 

max5432

Aktives Mitglied
Bin wieder einen Schritt weiter. Danke. Und auch schon beim nächsten Problem.

Wenn ich die Zeichenkette .H4 "E/Ì/ in Unicode umsetzen probiere, liefert mir die Methode getBytes für das Zeichen Ì den Wert -52. Und, da ist mit Hexadarstellung der Zahl vorbei.

Ich vermute, dass meine ganze Methode fraglich ist. Sie soll den erhaltenten String in einen Unicode-String umwandeln und ihn zurückgeben. Nach langem Probieren habe ich den Eindruck, dass ich den falschen Weg gehe.
[HIGHLIGHT="Java"]
public static String getUnicodeString(String text) throws UnsupportedEncodingException
{
byte[] buffer = text.getBytes();

String uniStr = "", hex = "";
int x = 0, n = 0;

for (int i = 0; i < buffer.length; i++)
{
n = (int)buffer;
hex = Integer.toHexString(n);
x = Integer.parseInt(hex, 16);
uniStr += new String(Character.toChars(x));
}

return uniStr;
}
[/HIGHLIGHT]

Was mache ich falsch bzw. wie könnte man dies richtig machen?
 

Ebenius

Top Contributor
Willst Du nicht eigentlich das da machen?
[HIGHLIGHT="Java"]public static String encodeXMLUnicodeSequences(String text)
throws UnsupportedEncodingException {
final char[] charArray = text.toCharArray();
final StringBuilder result = new StringBuilder();
final Formatter formatter = new Formatter(result);
for (char c : charArray) {
if (c == '&') {
result.append("&amp;");
} else if (c == '<') {
result.append("&lt;");
} else if (c == '>') {
result.append("&gt");
} else if (c > 0x1F && c < 0x80) {
result.append(c);
} else {
formatter.format("&#%04X;", new Integer(c));
}
}

return result.toString();
}[/HIGHLIGHT]

Ebenius
 

max5432

Aktives Mitglied
String sind in Java immer Unicode-Strings - eigentlich solltest Du daran nichts ändern müssen: Du kannst den Unicode direkt in das Element packen; um das Quoting / Encoding muss sich JDOM kümmern.

An sich ist das so. Leider werden manche Zeichen, die ich in meinen Daten finde, von JDOM nicht akzeptiert (aus welchem Grund auch immer). Jeder Versuch, Strings mit solchen Zeichen in ein Element zu schreiben, wird mti einer Ausnahme quittiert. Darum probiere ich sie irgendwie "zu maskieren". Ich schliesse aber nicht aus, dass solche Zeichen unter Umständen Leichen im Speicher sind und evtl. gar nicht sinnvoll interpretiert werden können.
 

max5432

Aktives Mitglied
Was kommt denn da für eine Exception?

Beispiel (Auszug aus der Log-Datei):
[HIGHLIGHT="Java"]
[2009-02-27 00:16:13,000 / ERROR] (XmlHandler.java:186) - The data "'2*G
;' ' , ' ';
' , , '
'' " is not legal for a JDOM character content: 0x1b is not a legal XML character.
[/HIGHLIGHT]

Jetzt aber eine gute Nachricht: die von Ebenius vorgeschlagene Methode encodeXMLUnicodeSequences hat das Problem gelöst. Herzlichen Dank an Euch beide.
 
Status
Nicht offen für weitere Antworten.

Oben