Ho codice legacy (non l'ho scritto) che includeva sempre l'attributo di codifica, ma ricompilandolo in D2010, TXMLDocument non include più la codifica. Poiché i dati XML hanno caratteri accentati sia su tag sia su dati, TXMLDocument.LoadFromFile lancia semplicemente EDOMParseErros affermando che sul file è stato trovato un carattere non valido. codice rilevante:Come rendere TXMLDocument (con l'implementazione MSXML) sempre include l'attributo di codifica?
Doc := TXMLDocument.Create(nil);
try
Doc.Active := True;
Doc.Encoding := XMLEncoding;
RootNode := Doc.CreateElement('Test', '');
Doc.DocumentElement := RootNode;
<snip>
//Result := Doc.XMl.Text;
Doc.SaveToXML(Result); // Both lines gives the same result
su versioni precedenti di Delphi, viene generato il seguente riga:
<?xml version="1.0" encoding="ISO-8859-1"?>
Su D2010, questo viene generato:
<?xml version="1.0"?>
Se cambio manualmente la linea, tutto funziona come ha sempre funzionato negli ultimi anni.
UPDATE: xmlEncoding è una costante ed è definito come seguire
XMLEncoding = 'ISO-8859-1';
Questo è esattamente ciò che Microsoft consiglia anche per MSXML: http://msdn.microsoft.com/en-us/library/aa468560.aspx. Tuttavia, la cosa all'inizio del documento non è tecnicamente un'istruzione di elaborazione. È una * dichiarazione XML *; la stringa "xml" non è realmente consentita per il nome di un'istruzione di elaborazione, quindi sembra che il metodo 'CreateProcessingInstruction' stia facendo doppio dovere. –
@Rob: Questo è probabilmente il motivo per cui mi ci è voluto un po 'un paio di anni fa per capirlo (non avevo il link MSDN che hai fornito in quel momento). Tuttavia, potrebbe effettivamente essere considerato un'istruzione di elaborazione, non potrebbe, se sta dicendo al parser come interpretare il contenuto? "Questo è XML, ed è in questo set di caratteri - che renderà più facile la comprensione." –