Mi sembra di aver trovato qualcosa di incoerente tra le varie implementazioni XML all'interno di .Net 3.5 e sto lottando per capire che è nominalmente corretto.Come deve essere gestito il carattere ' t' all'interno dei valori degli attributi XML?
La questione è in realtà abbastanza facile da riprodurre:
Creare un documento XML semplice con un elemento di testo contenente '\ t' caratteri e dargli un attributo che contiene caratteri '\ t':
var xmlDoc = new XmlDocument { PreserveWhitespace = false, }; xmlDoc.LoadXml("<test><text attrib=\"Tab'\t'space' '\">Tab'\t'space' '</text></test>"); xmlDoc.Save(@"d:\TabTest.xml");
NB: Ciò significa che XmlDocument stesso è piuttosto soddisfatto dei caratteri "\ t" in un valore attribuite.
Caricare il documento utilizzando il nuovo XmlTextReader:
var rawFile = XmlReader.Create(@"D:\TabTest.xml"); var rawDoc = new XmlDocument(); rawDoc.Load(rawFile);
Caricare il documento utilizzando XmlReader.Create:
var rawFile2 = new XmlTextReader(@"D:\TabTest.xml"); var rawDoc2 = new XmlDocument(); rawDoc2.Load(rawFile2);
Confronta i documenti del debugger:
(rawDoc).InnerXml "<test><text attrib=\"Tab' 'space' '\">Tab'\t'space' '</text></test>" string (rawDoc2).InnerXml "<test><text attrib=\"Tab'\t'space' '\">Tab'\t'space' '</text></test>" string
Il documento letto utilizzando il nuovo XmlTextReader era quello che mi aspettavo, sia il '\ t' nel valore del testo che il valore dell'attributo era lì come previsto. Tuttavia, se si guarda il documento letto da XmlReader.Create, si scopre che il carattere '\ t' nel valore dell'attributo sarà stato convertito in un carattere ' '
.
Che .... !! :-)
Dopo un po 'di una ricerca su Google ho scoperto che potevo codificare un' \ t 'come' & # x9; ' - se ho usato questo invece di "\ t" nell'esempio XML entrambi i lettori funzionano come previsto.
Ora Altova XmlSpy e vari altri lettori XML sembrano essere perfettamente soddisfatti dei caratteri "\ t" nei valori degli attributi, la mia domanda è qual è il modo corretto di gestirli?
Devo scrivere file XML con caratteri "\ t" codificati in valori di attributo come XmlReader.Create si aspetta o gli altri strumenti XML sono corretti e i caratteri "\ t" sono validi e XmlReader.Create è rotto?
Quale modo dovrei risolvere per risolvere questo problema?
Sembra che tu abbia già trovato una soluzione alternativa - utilizzando ' '. – Oded
Possibile domanda correlata: [Programmazione utilizzando il carattere di tabulazione in .NET?] (Http://stackoverflow.com/questions/294939/environment-constants) –
@Oded: hai ragione - Posso usare la codifica " " ma solo se riesco a trovare un modo per scrivere il file che lo supporta. XmlDocument.Save scrive i caratteri '\ t' direttamente nel file, come fa DataSet.WriteXml. La codifica XML non dovrebbe essere qualcosa di cui mi devo preoccupare manualmente, che dovrebbe essere qualcosa che le classi XML fanno per te. Sto guardando le altre opzioni di scrittore in questo momento, ma la maggior parte sembra mantenere il "\ t" che a XmlReader.Create non piace. – SteveH