2010-06-09 5 views
7

Ho il seguente DOMCome posso interrompere XmlSerializer che trasforma ê in & # 234; in un attributo?

<row> 
     <link href="B&#252;ro.txt" target="_blank"> 
      my link 
     </link> 
    </row> 

Quando ho serializzare in un file utilizzando il XmlSerializer Java che viene fuori in questo modo:

<row> 
     <link href="B&amp;#252;ro.txt" target="_blank"> 
      my link 
     </link> 
    </row> 

Esiste un modo per controllare il modo in cui XmlSerializer maniglie fuga in attributi? Dovrei fare diversamente in questo modo?

Aggiornamento

Dovrei anche dire che sto usando JRE 1.6. Ero stato con JRE 1.5 fino a poco tempo e sono abbastanza sicuro che è stato serializzato 'correttamente' (vale a dire la '&' non era sfuggito)

Chiarimento

Il DOM è stato creato a livello di codice. Ecco un esempio:

 Document doc = createDocument(); 
     Element root = doc.createElement("root"); 
     doc.appendChild(root); 
     root.setAttribute("test1", "&#234;"); 
     root.setAttribute("test2", "üöä"); 
     root.appendChild(doc.createTextNode("&#234;")); 

     StringWriter sw = new StringWriter(); 

     serializeDocument(doc, sw); 
     System.out.println(sw.toString()); 

La mia soluzione non volevo veramente fare questo perché ha coinvolto una discreta quantità di cambiamento del codice e test, ma ho deciso di spostare i dati degli attributi in un elemento CDATA. Problema risolto evitato.

risposta

2

Come si ottiene il DOM? Potrebbe avere qualcosa a che fare con quello? Ho provato il tuo XML di esempio con il DocumentBuilder standard (solo b/c mi è più familiare) usando Sun Java 6 e l'ultimo Xerces-J (2.9.1) che tra l'altro depreca XmlSerializer in favore di LSSerializer o TrAX.

Ad ogni modo, utilizzando questa tecnica, il documento serializzato non contiene più nemmeno il riferimento del carattere e viene convertito in "Büro.txt". Ho usato il seguente codice:

String xml = "<row>\n" 
    + "  <link href=\"B&#252;ro.txt\" target=\"_blank\">\n" 
    + "   my link\n" + "  </link>\n" + " </row>"; 

InputStream is = new ByteArrayInputStream(xml.getBytes()); 
Document doc = DocumentBuilderFactory.newInstance() 
    .newDocumentBuilder().parse(is); 

XMLSerializer xs = new XMLSerializer(); 
xs.setOutputCharStream(new PrintWriter(System.err)); 

xs.serialize(doc); 
+0

Grazie +1. Il DOM viene creato a livello di codice (appendChild etc). Aggiungerò un chiarimento alla domanda. Ho appena scoperto LSSerializier, quindi esaminerò quello. – paul

+0

Ok, vediamo. Forse qualcun altro conosce una soluzione migliore ma sospetto che sia impossibile (almeno in modo pulito) creare riferimenti di carattere in questo modo perché i dati vengono gestiti come tali e non come istruzioni XML. Potrebbe comunque essere sbagliato ... Poiché sia ​​XML che Java sono compatibili con Unicode, questo potrebbe non essere un problema. – musiKk

4

Il problema è che si sta costruendo il DOM con i valori degli attributi che sono già state "scappati", secondo le convenzioni XML. Il DOM (ovviamente) non si rende conto che l'hai fatto e sta sfuggendo alla e commerciale.

si dovrebbe cambiare

root.setAttribute("test1", "&#234;"); 

a

root.setAttribute("test1", "\u00EA"); 

In altre parole, le stringhe uso, comprensivi di codepoints Unicode semplici quando si costruisce il DOM. XMLSerializer dovrebbe quindi sostituire i caratteri Unicode con le entità di carattere come richiesto ... a seconda della codifica dei caratteri scelta per il documento di output.

MODIFICA - La ragione per cui si possono ancora visualizzare caratteri non elaborati piuttosto che entità di caratteri nell'output XML è che XMLSerializer utilizza la codifica predefinita per XML; cioè UTF-8. Il modo per risolvere questo problema è utilizzare il costruttore XMLSerializer(OutputFormat), passando un OutputFormat che specifica la codifica dei caratteri richiesta per l'XML. (Sembra che tu stia usando "ASCII".) Assicurarsi di utilizzare la codifica dei caratteri compatibili per OutputStream.

+0

+1 suona molto ragionevole. Tuttavia, ho provato e il '\ u00EA' rimane non elaborato. Sto inserendo il valore dell'attributo nell'attributo href di un tag di ancoraggio, ad es. paul

+0

The \ u00EA è un'uscita Unicode Java. Se in qualche modo appare nell'output in quella forma ... tu deve essere incluso nei dati di input anziché come carattere Java o stringa letterale. –

+1

Utilizzo di "ASCII" anziché di "UTF8" in quanto la codifica funziona correttamente. – Etan

Problemi correlati