Tengo código heredado (no lo escribí) que siempre incluía el atributo de codificación, pero recomprándolo a D2010, TXMLDocument ya no incluye la codificación. Debido a que los datos XML tienen caracteres acentuados en etiquetas y datos, TXMLDocument.LoadFromFile simplemente arroja EDOMParseErros diciendo que se encuentra un carácter no válido en el archivo. código relevante:¿Cómo hacer que TXMLDocument (con la implementación de MSXML) siempre incluya el atributo de codificación?
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
En las versiones anteriores de Delphi, se genera la siguiente línea:
<?xml version="1.0" encoding="ISO-8859-1"?>
En D2010, esto se genera:
<?xml version="1.0"?>
Si cambio manualmente la línea, todo funciona como siempre funcionó en los últimos años.
ACTUALIZACIÓN: XMLEncoding es una constante y se define como sigue
XMLEncoding = 'ISO-8859-1';
Eso es exactamente lo que Microsoft recomienda también para MSXML: http://msdn.microsoft.com/en-us/library/aa468560.aspx. Sin embargo, la cosa al principio del documento no es técnicamente una instrucción de procesamiento. Es una * declaración XML *; la cadena "xml" no está realmente permitida para el nombre de una instrucción de procesamiento, por lo que parece que el método 'CreateProcessingInstruction' cumple una función doble. –
@Rob: Probablemente es por eso que me tomó un tiempo hace un par de años resolverlo (no tenía el enlace de MSDN que me proporcionó en ese momento). Sin embargo, en realidad podría considerarse una instrucción de procesamiento, ¿no es así, si le está diciendo al analizador cómo interpretar el contenido? "Esto es XML, y está en este conjunto de caracteres, eso hará que sea más fácil de descifrar". –