2013-03-21 13 views
18

Sto cercando di prendere il xml seguito da db utilizzando un metodo di Java ma sto ottenendo un erroreCome risolvere byte non valido 1 di 1 byte UTF-8 sequenza

codice utilizzato per analizzare il codice XML

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 

InputSource is = new InputSource(new ByteArrayInputStream(cond.getBytes())); 

Document doc = db.parse(is); 

Element elem = doc.getDocumentElement(); 

// here we expect a series of <data><name>N</name><value>V</value></data> 
NodeList nodes = elem.getElementsByTagName("data"); 

TableID jobId = new TableID(_processInstanceId); 
Job myJob = Job.queryByID(_clientContext, jobId, true); 

if (nodes.getLength() == 0) { 
    log(Level.DEBUG, "No data found on condition XML"); 

} 

for (int i = 0; i < nodes.getLength(); i++) { 
    // loop through the <data> in the XML 

    Element dataTags = (Element) nodes.item(i); 
    String name = getChildTagValue(dataTags, "name"); 
    String value = getChildTagValue(dataTags, "value"); 

    log(Level.INFO, "UserData/Value=" + name + "/" + value); 

    myJob.setBulkUserData(name, value); 
} 

myJob.save(); 

I dati

<ContactDetails>307896043</ContactDetails> 
<ContactName>307896043</ContactName> 
<Preferred_Completion_Date> 
</Preferred_Completion_Date> 
<service_address>A-End Address: 1ST HELIERST HELIERJT2 3XP832THE CABLES 1 POONHA LANEST HELIER JE JT2 3XP</service_address> 
<ServiceOrderId>315473043</ServiceOrderId> 
<ServiceOrderTypeId>50</ServiceOrderTypeId> 
<CustDesiredDate>2013-03-20T18:12:04</CustDesiredDate> 
<OrderId>307896043</OrderId> 
<CreateWho>csmuser</CreateWho> 
<AccountInternalId>20100333</AccountInternalId> 
<ServiceInternalId>20766093</ServiceInternalId> 
<ServiceInternalIdResets>0</ServiceInternalIdResets> 
<Primary_Offer_Name action='del'>MyMobile Blue &#163;44.99 [12 month term]</Primary_Offer_Name> 
<Disc_Reason action='del'>8</Disc_Reason> 
<Sup_Offer action='del'>80000257</Sup_Offer> 
<Service_Type action='del'>A-01-00</Service_Type> 
<Priority action='del'>4</Priority> 
<Account_Number action='del'>0</Account_Number> 
<Offer action='del'>80000257</Offer> 
<msisdn action='del'>447797142520</msisdn> 
<imsi action='del'>234503184</imsi> 
<sim action='del'>5535</sim> 
<ocb9_ARM action='del'>false</ocb9_ARM> 
<port_in_required action='del'> 
</port_in_required> 
<ocb9_mob action='del'>none</ocb9_mob> 
<ocb9_mob_BB action='del'> 
</ocb9_mob_BB> 
<ocb9_LandLine action='del'> 
</ocb9_LandLine> 
<ocb9_LandLine_BB action='del'> 
</ocb9_LandLine_BB> 
<Contact_2> 
</Contact_2> 
<Acc_middle_name> 
</Acc_middle_name> 
<MarketCode>7</MarketCode> 
<Acc_last_name>Port_OUT</Acc_last_name> 
<Contact_1> 
</Contact_1> 
<Acc_first_name>.</Acc_first_name> 
<EmaiId> 
</EmaiId> 

L'ERRORE

org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence. 

Ho letto alcuni thread a causa di alcuni caratteri speciali nell'xml. Come risolvere questo problema?

+0

Come avrete notato, la vostra domanda è difficile da capire senza una formattazione corretta. – Kai

+4

Non è di aiuto che tu non abbia mostrato alcun codice, ma sospetto che il tuo file XML sia fondamentalmente non valido. Sospetto che stia sostenendo di essere UTF-8 ma * non * UTF-8. Dovresti correggere qualunque cosa stia producendo il file cattivo. –

+0

Controllare definitivamente il database; se correttamente archiviato come UTF-8, verificare se il connettore java necessita di un'impostazione su UTF-8 (lo è per MySQL). Se il database è stato definito in modo errato, è necessario passare a UTF-8 in quanto è più versatile. –

risposta

12

Come risolvere questo problema?

Leggere i dati utilizzando la codifica dei caratteri corretta. Il messaggio di errore indica che stai cercando di leggere i dati come UTF-8 (deliberatamente o perché è la codifica predefinita per un file XML che non specifica <?xml version="1.0" encoding="somethingelse"?>) ma in realtà è in una codifica diversa come ISO-8859- 1 o Windows-1252.

Per essere in grado di consigliare come dovresti farlo dovrei vedere il codice che stai usando per leggere l'XML.

+0

mi viene visualizzato questo errore quando si tenta di analizzare l'xml utilizzando il codice sottostante – shaiksha

+0

Grazie a tutti sono riuscito a risolvere il problema. Impostando encodin su ISO-8859-1 prima di analizzare DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource (new ByteArrayInputStream (cond.getBytes())); is.setEncoding ("ISO-8859-1");  aggiunta questa riga al codice esistente Documento doc = db.parse (is); Elemento elem = doc.getDocumentElement(); – shaiksha

6

Prova:

InputStream inputStream= // Your InputStream from your database. 
Reader reader = new InputStreamReader(inputStream,"UTF-8"); 

InputSource is = new InputSource(reader); 
is.setEncoding("UTF-8"); 

saxParser.parse(is, handler); 

Se si tratta di altro che UTF-8, basta cambiare la parte di codifica per il bene uno.

+0

Penso che sia la risposta migliore perché consente di gestire l'errore descritto per tutti i tipi di InputStreams, non solo File. – sinedsem

12
  1. Aprire il codice XML nel blocco note
  2. Assicurarsi non avete spazio in più all'inizio e alla fine del documento.
  3. Selezionare File -> Salva con nome
  4. selezionare Salva con nome tipo -> Tutti i file
  5. Immettere il nome del file come abcd.xml
  6. seleziona Codifica - UTF-8 -> Fare clic su Salva
+1

modo semplice .... risolto il mio problema. –

+2

vale la pena menzionare questo ha funzionato sul blocco note e non sul blocco note ++ – svarog

+0

Risolto il mio problema. – user3548196

1

I aveva questo problema, ma il file era in UTF-8, era solo che in qualche modo sul personaggio era arrivato che non era codificato in UTF-8. Per risolvere il problema ho fatto quello che è riportata in questo thread, cioè io convalidato il file: How to check whether a file is valid UTF-8?

Fondamentalmente si esegue il comando:

$ iconv UTF-8 -f your_file -o/dev/null

E se c'è qualcosa che non è codificato in UTF-8, ti darà i numeri di riga e di riga in modo che tu possa trovarlo.

0

Mi è capitato di imbattersi in questo problema a causa di una build Ant.

Quella build di Ant ha preso i file e applicato filterchain expandproperties ad esso. Durante questo filtraggio dei file, per generare i file filtrati è stata utilizzata la codifica dei caratteri implicita predefinita non UTF-8 della mia macchina Windows, pertanto i caratteri al di fuori del set di caratteri non potevano essere mappati correttamente.

Una soluzione era fornire a Ant una variabile di ambiente esplicita per UTF-8. In Cygwin, prima di avviare Ant: export ANT_OPTS="-Dfile.encoding=UTF-8".

0

Ho incontrato lo stesso problema e dopo lunghe ricerche sul mio file XML ho trovato il problema: c'erano pochi caratteri senza caratteri di escape come «».

1

Stavo ricevendo l'xml come stringa e utilizzando xml.getBytes() e ottenendo questo errore. Il passaggio a xml.getBytes (Charset.forName ("UTF-8")) ha funzionato per me.

0

quelli come me che capiscono i principi di codifica dei caratteri, also read Joel's article che è divertente come contains wrong characters anyway e ancora non riesco a capire cosa diavolo (spoiler alert, io sono utente Mac), allora la soluzione può essere semplice come rimozione del repository locale e clonazione di nuovo.

La mia base di codice non è cambiata dall'ultima volta che era in esecuzione OK, quindi non aveva senso avere errori UTF dato che il nostro sistema di compilazione non si è mai lamentato di questo .... fino a quando mi sono ricordato che ho accidentalmente scollegato il mio pochi giorni fa con IntelliJ Idea e tutto il resto in esecuzione (Java/Tomcat/Hibernate)

Il mio Mac ha fatto un ottimo lavoro fingendo che non sia successo niente e ho continuato a lavorare come al solito, ma il file system sottostante è stato danneggiato in qualche modo. Ho perso tutto il giorno cercando di capire questo. Spero che aiuti qualcuno.

Problemi correlati