2012-04-18 21 views
7

Tengo un archivo XML, que está formateado originalmente con sangrías de espacio (2 espacios para cada elemento anidado).IXMLDocument.SaveToFile() utiliza el carácter de tabulación para la sangría en lugar de espacios

Cuando cargo y guardo este archivo utilizando IXMLDocument, las sangrías de espacio están cambiando a los caracteres de tabulación (código n. ° 9).

Aquí está el código:

var 
    FileName: String; 
    Document: IXMLDocument; 
... 
Document := XMLDoc.LoadXMLDocument(FileName); 
Document.SaveToFile(FileName); 

He intentado utilizar NodeIndentStr propiedad - no hay resultados:

Document := XMLDoc.LoadXMLDocument(FileName); 
Document.NodeIndentStr := ' '; 
Document.SaveToFile(FileName); 

usados ​​FormatXMLData también - no hay resultados:

Document := XMLDoc.LoadXMLDocument(FileName); 
Document.XML.Text := XMLDoc.FormatXMLData(Document.XML.Text); 
Document.Active := True; 
Document.SaveToFile(FileName); 

¿Cómo puedo guardar con sangrías de espacio en lugar de caracteres de tabulación?

+1

Es posible que desee leer este artículo de Zarko Gajic, [delphi-formato-xml-nodo-guión] (http://delphi.about.com/od/delphitips2009 /qt/delphi-format-xml-node-indent.htm). La solución provista utiliza 'xmlDoc.FormatXMLData' para formatear el archivo de una manera agradable. –

+0

@LURD intentado - sin resultado :( – Andrew

+0

Veo dónde está el problema ahora, el 'FormatXMLData' no tiene ninguna posibilidad de saber qué' NodeIndentStr' estás usando ya que estás pasando una cadena a esa función, por lo tanto usa la TAB predeterminada – TLama

Respuesta

11

Hay una opción en IXMLDocument donde se le puede decir al analizador que preserve los espacios en blanco.

utilizar de esta manera:

Document.ParseOptions := 
    Document.ParseOptions+[poValidateOnParse]+[poPreserveWhiteSpace]; 

responsabilidad: yo no lo he probado.

+0

+1. Estoy en D5 ahora, y no puedo probarlo con las versiones más nuevas de Delphi, pero si el 'IXMLDocument' es un envoltorio alrededor de' IXMLDOMDocument' esto debería funcionar (probado con 'IXMLDOMDocument'). – kobik

+1

sí, funciona. Gracias. Nota: 'ParseOptions' debe establecerse antes de' LoadFromFile() ' – Andrew

+0

+1 de mí también. Este es el truco. Tal vez estaría bien mencionar que no hay necesidad de usar las opciones 'NodeIndentStr' ni' doNodeAutoIndent' ya que está pasando cadena a la función 'FormatXMLData' (no al documento en sí), por lo tanto, tiene su propia configuración. Y puede eliminar el indicador 'poValidateOnParse' ;-) – TLama

0

No estoy seguro de qué es diferente pero Document.ParseOptions + [poValidateOnParse, poPreserveWhiteSpace]; no fue accesible para mí.

Algo similar funcionó:

var 
    xmlDoc: IXMLDOMDocument2; 

xmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument2; 
xmlDoc.validateOnParse := True; 
xmlDoc.preserveWhiteSpace := True; 
Cuestiones relacionadas