2010-06-24 33 views
5

Ho un programma che genera file Xml da dati di un database. In breve codice esegue le seguenti operazioni:carattere non valido nel documento xml

string dsn = "a db connection string"; 
XmlDocument d = new XmlDocument(); 
using (SqlConnection con = new SqlConnection(dsn)) { 
    con.Open(); 
    string sql = "select id as Id, comment as Comment from Test where ... "; 
    using (SqlCommand cmd = new SqlCommand(sql, con)) { 
     DataSet ds = new DataSet("EXPORT"); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(ds, "Test"); 
     d.LoadXml(ds.GetXml()); 
    } 
} 
d.Save(@"c:\test.xml"); 

Quando ho uno sguardo al file XML che contiene il carattere non valido & # x 1 A;

<EXPORT> 
    <Test> 
    <Id>2</Id> 
    <Comment> Keyboard NB&#x1A;5 linked</Comment> 
    </Test> 
</EXPORT> 

Questo file XML non può essere aperto dal browser firefox dicendo carattere non valido ...

tale entità è riservato nella norma ISO 8859-1 e CP1252 e non deve essere resa dai browser. Ma perché XmlDocument restituisce xml che non può essere analizzato come valido - o è un documento xml valido che non può essere analizzato dai browser o importato da Excel e così via ... C'è un modo semplice per sbarazzarsi di quello riservato? caratteri non validi o codificandoli in modo che i browser non abbiano un problema con esso?

Molte grazie per la tua opinione e Tipps

+0

Ho avuto lo stesso identico problema con i vari metodi XML per gli oggetti System.Data. Non sono sicuro di cos'altro potrebbero fare quei metodi. La loro alternativa è quella di spogliare i personaggi o lanciare un'eccezione. –

risposta

3

Non tutti i caratteri sono rappresentabili in XML.

In XML 1.0, non è possibile utilizzare nessuno dei caratteri con valori inferiori a 0x20, ad eccezione di TAB (0x09), LF (0x0A) e CR (0x0D).

In XML 1.1, è possibile utilizzare qualsiasi cosa tranne NUL (0x00).

Se avete la possibilità di utilizzare XML 1.1, e il programma di ricezione supporta XML 1.1 (non molti lo fanno), allora si può sfuggire al 0x1A come &#26; o &#x1A;.

Il riavvolgimento in CDATA non è una soluzione; CDATA è solo una comodità per l'escape di gruppi di caratteri in modo diverso rispetto allo standard & -meccanismo.

In caso contrario, sarà necessario rimuoverlo prima della serializzazione.

+0

scusa per aver risposto abbastanza tardi a quella vecchia domanda - Ho rimosso i caratteri prima della serializzazione ... Thx –

0

Date un'occhiata a questa risposta per vedere se aiuta:

.NET DataSet.GetXml() - what's the default encoding?

+0

Grazie per il tuo tipp, ma la stringa che ottengo con ds.GetXml() è internamente in unicode (utf-16). Penso che quando si scrive in un file di testo senza modificare la codifica tutto dovrebbe essere ok? –

0

penserei che stai elaborazione di un Control-Z (fine del file di testo) carattere. È possibile?

+0

Hm google ha detto "riservato inutilizzato" per iso8859-1 e il suo superset cp1252 potrebbe essere il segno di fine del file, ... ma il contenuto in DB è una scatola nera per me, quindi non ho possibilità di filtrare per l'input pulito nel DB tabelle ... –

1

Ci sono alcune volte in cui ho creato/manipolato XML da dati SQL.

Ma perché xml uscita XmlDocument che non può essere analizzato come valido - o è un documento XML valido che proprio non può essere analizzato da browser o importati da Excel e così via

Il XmlDocument doesn' t eseguire qualsiasi convalida sui dati che l'hai inviato, lascia a te (lo sviluppatore). Questo documento XML dovrebbe essere invalido in quasi ogni cosa che usa XML (ma potrei sbagliarmi ... potresti sempre testarlo: P)

Quasi ogni volta che ho riscontrato questo problema, ho finito per usare sostituire i dati XML offensivi con il carattere appropriato (se ne ha uno) o semplicemente eliminarlo.

Si potrebbe anche provare a mettere il vostro XML all'interno di un blocco CDATA, ma che sarà gonfiare il file un po 'piccolo (non so quanto è grande generale il file sarà)

-1

Assicurarsi di evitare le entità XML, ad es. & => &amp; In caso contrario, raggruppare i dati in CDATA http://en.wikipedia.org/wiki/CDATA

+0

Anche come entità, '', non è ancora valida. –

+0

Due problemi. 1. Le entità XML e HTML sono cose diverse. Di default XML supporta solo 5 entità, il resto può essere definito da un DTD.  è un'entità HTML, non XML. Quindi  non funzionerà in XML, avresti bisogno di scriverlo come . Problema 2. come sopra suggerito, i caratteri non stampabili non possono essere inseriti in XML. Quindi dovrai scappare qualcosa come  a & # 21; prima che venga analizzato da XML. –

Problemi correlati