2009-12-22 10 views
15

Sto cercando di analizzare un file XML che contiene alcuni caratteri speciali come "&" utilizzando il parser DOM. Ricevo l'eccezione saxparse "il riferimento all'entità deve terminare con un delimitatore". C'è un modo per superare questa eccezione, dal momento che non posso modificare il file XML per rimuovere i caratteri speciali, poiché proviene da diverse applicazioni. Si prega di suggerire un modo per analizzare questo file XML per ottenere l'elemento radice?org.xml.sax.SAXParseException: il riferimento all'entità "T" deve terminare con ";" delimitatore

Grazie in anticipo

Questa parte del XML che sto parsing

<P>EDTA/THAM WASH 
</P> 

<P>jhc^72. METER SOLVENT: Meter 21 LITERS of R. O. WATER through the add line into 
FT-250. Start agitator. 
</P> 

<P>R. O. WATER &lt;ZLl LITERS </P> 

<P>•  NOTE: The following is a tool control operation. The area within 10 feet of any open vessel or container is under tool control. </P> 

<P>-af . 73. CHARGE SOLIDS: Remove any unnecessary items from the tool controlled area. Indicate the numbers of each item that will remain in the tool controlled area during the operation in the IN box of the Tool Control Log. </P> 

<P>^___y_ a. To minimize the potential for cross contamination, confirm that no other solids are being charged or packaged in adjacent equipment. </P> 

<P>kk k WARNING: Wear protective gloves, air jacket and use local exhaust when handling TROMETHAMINE USP (189400) (THAM) (K-l--Irritant!). The THAM may be dusty. </P> 

<P>-&lt;&amp;^b . Charge 2.1 KG of TROMETHAMINE USP (189400) (THAM) into FT-250 through the top. </P> 

<P>TROMETHAMINE USP (189400) (THAM) </P> 

<P>Scale ID: // 7S </P> 

<P>LotNo.: qy/o^yo^ </P> 

<P>Gross: ^. S </P> 

<P>Tare: 10 ,1 </P> 

<P>Net:  J^l </P> 

<P>Total: JL'J </P> 

<P><Figure ActualText="&T "> 

<ImageData src="images/17PT 07009K_img_1.jpg"/> 
&amp;T </Figure> 
Checked by </P> 

risposta

12

io non sono sicuro di aver capito la domanda. Per quanto ne so, a meno che tu non sia all'interno di un , i caratteri nudi & senza una chiusura ; non sono validi.

Se ciò non è il caso per il file XML, non è valido e sarà necessario trovare un altro modo per analizzarlo o correggerlo prima che SAX lo tenga in considerazione.

Se sto fraintendendo qualcosa qui, dovresti probabilmente pubblicare un campione dell'XML effettivo in modo da poterlo approfondire.

Aggiornamento:

Assomiglia:

Figure ActualText="&T " 

è la linea incriminata. Questa sezione è all'interno di un CDATA o no? In caso contrario, questo è non XML valido e non dovresti aspettarti che SAX sia in grado di gestirlo.

Avrai bisogno di uno:

  • modificare l'applicazione che lo ha creato; oppure
  • risolvere il problema prima che venga caricato da SAX (se non è possibile modificare tale applicazione) su qualcosa come "Figure ActualText="&amp;T ""; oppure
  • trovare un metodo non SAX per l'analisi.
1

Per risolvere il problema, è possibile:

  1. Sostituire tutte le occorrenze di & con &amp; nell'input originale;
  2. Analizzarlo;
  3. Nel codice che gestisce il risultato, gestisci il caso in cui ora vengono visualizzati caratteri di escape (ad esempio &lt; anziché <).

A seconda del parser che si sta utilizzando, si può anche provare a trovare la classe responsabile per l'analisi e unescaping & -strings, e vedere se è possibile estenderlo/fornire il proprio risolutore. (Quello che sto dicendo è molto vago, ma le specifiche dipendono dagli strumenti che stai usando.)

1

Il tuo input non è valido XML. In particolare, non è possibile avere un carattere '&' in un valore di attributo a meno che non faccia parte di un riferimento di entità carattere ben formato.

per quanto ne so, si hanno due scelte:

  • scrivere una "non esattamente XML" parser te stesso. Dubito seriamente che ne troverai uno esistente. Qualsiasi parser XML che si rispetti respingerà l'input non valido.
  • Correggere qualsiasi cosa stia creando questo XML (cosiddetto) in modo che non inserisca caratteri "&" casuali in luoghi in cui non sono consentiti. È davvero semplice. Mentre stai creando l'XML, sostituisci il carattere "&" che non fa già parte di un riferimento di carattere con "& amp;"
25

Come altri hanno affermato, il tuo XML non è valido. Tuttavia, se non è possibile modificare l'applicazione di generazione e può aggiungere una fase di pulizia quindi il seguente dovrebbe ripulire l'XML:

String clean = xml.replaceAll("&([^;]+(?!(?:\\w|;)))", "&amp;$1"); 

cosa che regex sta facendo è alla ricerca di eventuali riferimenti alle entità mal formati e fuggire la e commerciale .

In particolare, (?!(?:\\w|;)) è un look-ahead negativo che interrompe tale corrispondenza in tutto ciò che non è un carattere di parola (a-z, 0-9) e non un punto e virgola. Quindi l'intera regex cattura tutto dal & che non è un; fino al primo carattere non parola, non semi-colon.

Mette tutto tranne la e commerciale nel primo gruppo di acquisizione in modo che possa essere indicato nella stringa di sostituzione. Questo è il $ 1.

Si noti che questo non risolverà i riferimenti che sembrano validi ma non lo sono. Ad esempio, se tu avessi & T; questo genererebbe un diverso tipo di errore, a meno che l'XML non definisca effettivamente l'entità.

+0

Solo una piccola osservazione. Ovviamente è invalido qualunque sia lo schema, ma prima non è ben formato. Non stiamo parlando di schemi qui. – lkuty

+1

String xml = " Aaa & Bbb & Ccc"; risultati in Aaa & Bbb & Ccc. Questo può essere fatto funzionare per più di uno e nella stringa di input? –

+5

Sì. Prova "&([^; &] + (?! (?: \\ w |;)))" (aggiunto e su pos 6) - questo dovrebbe funzionare per più e nell'input. – robbi5

8

Alcuni di voi potrebbero avere familiarità con l'ERRORE "Il riferimento all'entità XX deve terminare con il"; "delimitatore mentre si aggiunge o si modifica qualsiasi parte di codice nei propri modelli XML. Anche a volte ricevo quell'ERRORE quando provo ad alterare o aggiungere dei codici ai modelli del mio blogger blog (XML).

Principalmente questo tipo di ERRORE si verifica mentre aggiungiamo banner o widget di terze parti ai nostri modelli XML. Possiamo facilmente correggere ERRORE modificando leggermente il pezzo di codice che aggiungiamo!

Just replace “&” with “&amp;” in your HTML/Javascript code! 

ESEMPIO

Original Code: 
<!– Begin Code –> 
<script src="http://XXXXXX.com/XXX.php?sid=XXX&br=XXX&dk=XXXXXXXXXXXX" type="text/javascript"/> 
<!– End Code –> 

Altered Code: 

<!– Begin Code –> 
<script src="http://XXXXXX.com/XXX.php?sid=XXX&amp;br=XXX&amp;dk=XXXXXXXXXXXX" type="text/javascript"/> 
<!– End Code –> 
1

costruzione su una risposta di cui sopra dal PSpeed ​​seguente espressione regolare e la sostituzione del testo replaceAll sostituirà tutti i segni & escape con ampersands sfuggiti.

String clean = xml.replaceAll(("(&(?!amp;))", "&amp;")); 

Il modello è un lookahead negativo per abbinare su eventuali e commerciali che non sono stati ancora sfuggiti e la stringa di sostituzione è semplicemente una e commerciale sfuggito. Questo può essere ulteriormente ottimizzato per le prestazioni usando un Pattern compilato staticamente.

private final static Pattern unescapedAmpersands = Pattern.compile("(&(?!amp;))"); 

... 

Matcher m = unescapedAmpersands.matcher(xml); 
String xmlWithAmpersandsEscaped = m.replaceAll("&amp;"); 
0

sostituire semplicemente il vostro & con &amp; e funzionerà.

Problemi correlati