Avatar billede roo104 Nybegynder
26. maj 2004 - 18:52 Der er 36 kommentarer og
1 løsning

invalid XML character

Jeg forsøger at lave et DOM træ i følge arne's artikel http://eksperten.dk/artikler/245. Det går sådan set også fint nok, men jeg det data jeg tilføjer til træet indeholder på en eller anden måde nogle invalide charcters. Jeg får denne fejl:
java.io.IOException: The character '' is an invalid XML character.
Jeg styrer desværre ikke helt selv (endnu) ikke hvilke characters der skal tilføjes da det er noget data jeg henter fra en anden server. Hvordan får jeg parset dem som valide chars. ?
Jeg ved desværre heller ikke lige hvilken char det er, da den bare vises som en firkant hos mig :( håber i forstår mit spg.
Avatar billede arne_v Ekspert
26. maj 2004 - 19:04 #1
Mit gæt: der er problemer med ISO-8859-1 versus UTF-8 prøv og læs
data eksplicit som ISO-8859-1 og eksplicit som UTF-8 og se om en af
dem virker.
Avatar billede roo104 Nybegynder
26. maj 2004 - 19:07 #2
Hvordan sætter jeg lige encodingen til ISO-8859-1
Avatar billede arne_v Ekspert
26. maj 2004 - 19:08 #3
Hvad læser du med ?
Avatar billede arne_v Ekspert
26. maj 2004 - 19:08 #4
Hvilke klasser ?
Avatar billede roo104 Nybegynder
26. maj 2004 - 19:10 #5
har taget udgangspunkt i CreateW3CDOM.java
Avatar billede arne_v Ekspert
26. maj 2004 - 19:12 #6
Jamen det tilføjer jo hardcoded data.

Du henter data fra en anden server.
Avatar billede roo104 Nybegynder
26. maj 2004 - 19:17 #7
prøvede lige
OutputFormat fmt = new OutputFormat(); 
fmt.setEncoding("ISO-8859-1");

Ja men det er bare ren tekst intet med XML at gøre.

Tilføjer bare Noder, sådan her:
Element server_os = doc.createElement("server_os");
server_os.appendChild(doc.createTextNode(serverOS));

Hvor serverOS er en Streng, den er dog hentet fra en server, derfor jeg ikke styrer hvilke chars. den indeholder
Avatar billede roo104 Nybegynder
26. maj 2004 - 19:22 #8
Ahhh tror det er ^, prøver lige at replace den
Avatar billede arne_v Ekspert
26. maj 2004 - 19:45 #9
^ burde være legalt som text.

Men hvordan læser du den variabel serverOS ? InputStream read ? BufferedReader readLine ?
Avatar billede roo104 Nybegynder
26. maj 2004 - 19:48 #10
Som en DataInputStream
Avatar billede arne_v Ekspert
26. maj 2004 - 19:50 #11
Hvilken metode i DataInputStream ?
Avatar billede roo104 Nybegynder
26. maj 2004 - 19:51 #12
hvad med tegn som < og > og strenge som </ ? kan den klare sådan nogle, jeg kan se at problemet opstår når jeg skriver det ned på disken.

OutputFormat fmt = new OutputFormat(); 
            fmt.setEncoding("ISO-8859-1");
            fmt.setIndenting(true); 
           
            FileWriter fw = new FileWriter("C:/test.xml");
           
            XMLSerializer ser = new XMLSerializer(fw, fmt);           
            ser.serialize(doc);
Avatar billede roo104 Nybegynder
26. maj 2004 - 19:54 #13
readUnsignedByte()

Nu fik jeg den til at skriev det på disken, men ved ikke lige hvorfor har ikke ændret noget
Avatar billede arne_v Ekspert
26. maj 2004 - 19:56 #14
readUnsignedByte() kræver at du selv angiver karakter sæt når du
laver om til String
Avatar billede arne_v Ekspert
26. maj 2004 - 19:56 #15
< og >  skal somme tider laves som &lt; og &gt;
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:01 #16
Tror det er når jeg skriver det ud, den stopper efter 56 kb data hver gang, måske det er et bufferproblem ? Jo, den stopper efter præsic 57.344 bytes til trods for at det er forskellig data der skrives, så chancen for den ramte det tegn der er nok ikke ret stor
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:04 #17
Kan man ikke sætte en buffer på FileWriter ?
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:11 #18
FileWriter fw = new FileWriter("C:/test.xml");
            BufferedWriter bw = new BufferedWriter(fw);
           
            XMLSerializer ser = new XMLSerializer(bw, fmt);   

Hjalp ikke lige.

Den cutter bare mit i XML'en

  <net_adress ip="198.143.25.15:27015">
        <host_name>STASH {NYC}</host_name>
        <map_name>de_dust</map_name>
        <game_dir>cstrike</game_dir>
        <game_desc>Counter-Strike</game_desc>
        <max_clients>12</max_clients>
        <active_clients>0</active_clients>
        <protocol_version>47</protocol_versio

Det er ikke engang et tegn den prøver at skrive ud den mangler n> af den sætning
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:18 #19
En StackTrace giver:
java.io.IOException: The character '' is an invalid XML character
        at org.apache.xml.serialize.BaseMarkupSerializer.fatalError(Unknown Source)
        at org.apache.xml.serialize.BaseMarkupSerializer.surrogates(Unknown Source)
        at org.apache.xml.serialize.XMLSerializer.printText(Unknown Source)
        at org.apache.xml.serialize.BaseMarkupSerializer.characters(Unknown Source)
        at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source)
        at org.apache.xml.serialize.XMLSerializer.serializeElement(Unknown Source)
        at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source)
        at org.apache.xml.serialize.XMLSerializer.serializeElement(Unknown Source)
        at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source)
        at org.apache.xml.serialize.XMLSerializer.serializeElement(Unknown Source)
        at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source)
        at org.apache.xml.serialize.BaseMarkupSerializer.serializeNode(Unknown Source)
        at org.apache.xml.serialize.BaseMarkupSerializer.serialize(Unknown Source)
Avatar billede arne_v Ekspert
26. maj 2004 - 20:22 #20
Er alle data læst fra den eksterne server ?
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:23 #21
ja de bliver læst fint nok
Avatar billede arne_v Ekspert
26. maj 2004 - 20:26 #22
Har du verificeret at alle læste tegn er valide printable tegn ?

Hvad version af Xerces kører du med ?
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:28 #23
XMLSerializer ser = new XMLSerializer(System.out, fmt);           
            ser.serialize(doc); 
Laver samme nummer, så der er nok her den går galt.
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:30 #24
2.6.2
Ved ikke helt hvilke tegn jeg skal gå efter udover < og >
Avatar billede arne_v Ekspert
26. maj 2004 - 20:31 #25
Tegn udenfor 32-126
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:37 #26
ok der er jo en del, hvordan gør man det nemmest ?
Avatar billede arne_v Ekspert
26. maj 2004 - 20:41 #27
int b = dis.readUnsignedByte();
if(b < 32 || b > 126) {
  System.out.println("hej - jeg læste lige en " + b);
}
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:50 #28
Tror sq det virker nu:
            while ((tal = in.readUnsignedByte()) != 0x00)
                if (tal > 32 && tal < 126)
                    hostName += (char)tal;

må 32 og 126 godt være med ?
Avatar billede arne_v Ekspert
26. maj 2004 - 20:52 #29
Ja.

32 = mellemrum
126 = tilde
Avatar billede arne_v Ekspert
26. maj 2004 - 20:52 #30
men det var lidt interessant at vide hvilke tegn der ikke var i det range ...
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:54 #31
Der er nok nogle øst lande servere imellem, de har nu nogle sjove tegn
Avatar billede roo104 Nybegynder
26. maj 2004 - 20:56 #32
Lav et svar du virkelig fortjænt de point, jeg troede bare det var et lille simpelt spg.
Jeg kan nok finde ud af hvad det er for tegn, hvis du kan lave dem om fra bytes til chars
Avatar billede arne_v Ekspert
26. maj 2004 - 20:58 #33
øst lande tegn burde fungere fint hvis du bruger UTF-8

hvis du bare giver mig integer koden for de tal der giver problemer kan
jeg muligvis komme med et gæt
Avatar billede arne_v Ekspert
26. maj 2004 - 20:59 #34
svar
Avatar billede roo104 Nybegynder
26. maj 2004 - 21:02 #35
Der er 13,25,174,176
Avatar billede roo104 Nybegynder
26. maj 2004 - 21:04 #36
13 Carriage return
174 trademark
176 procent

eller sådan noget 25 ved jeg ikke lige
Avatar billede arne_v Ekspert
26. maj 2004 - 21:12 #37
Det ser godt nok lidt spøjst ud
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester