2010-11-23 14 views
1

Test.xml:ColdFusion: xmlparse ne conserve pas de retour chariot

<?xml version="1.0" encoding="UTF-8"?> 
<node>line1 
line2 
line3</node> 

Code CF:

<cfset xmlfile = ExpandPath("test.xml")> 
<cffile action="read" file="#xmlfile#" variable="xmlstring"> 
<cffile action="write" file="test1.xml" output="#xmlstring#"> 

<cfset xmldoc = XmlParse(xmlstring)> 
<cfset xmltext = ToString(xmldoc)> 
<cffile action="write" file="test2.xml" output="#xmltext#"> 

Le fichier d'entrée fichier test.xml est au format CRLF, codage UTF-8, 77 octets. Le premier fichier de sortie (test1.xml) est au format CRLF, codé ANSI, 76 octets. Le deuxième fichier de sortie (test2.xml) est au format UNIX, codé ANSI, 71 octets.

Le contenu du noeud XML dans le fichier d'entrée est line1 Chr(13)Chr(10) line2 Chr(13)Chr(10) line3 (espaces pour la lisibilité). Le contenu du noeud XML dans le premier fichier de sortie est le même que ci-dessus. Le contenu du noeud XML dans le deuxième fichier de sortie est line1 Chr(10) line2 Chr(10) line3.

Des idées pour lesquelles le caractère de retour chariot Chr(13) n'a pas été conservé après la séquence XmlParse/ToString?

MISE À JOUR: Le problème réside uniquement avec XmlParse. Il ne s'agit pas de ToString ou de cffile. Voici un exemple plus pertinent - vous pouvez tester vous-mêmes:

<cfsavecontent variable="xmlvar"> 
<nodes> 
    <node> 
line1 
line2 
line3 
    </node> 
</nodes> 
</cfsavecontent> 

<cfset vtext = "#xmlvar#"> 
<cfset vtext = Replace(vtext,Chr(10),'LF','All')> 
<cfset vtext = Replace(vtext,Chr(13),'CR','All')> 
<cfdump var = "#vtext#"> 
<!--- outputs CRLF<nodes>CRLF <node>CRLFline1CRLFline2CRLFline3CRLF </node>CRLF</nodes>CRLF ---> 
<cfset xmldoc = XmlParse(xmlvar)> 
<cfset vtext = "#xmldoc.nodes.node.XmlText#"> 
<cfset vtext = Replace(vtext,Chr(10),'LF','All')> 
<cfset vtext = Replace(vtext,Chr(13),'CR','All')> 
<cfdump var = "#vtext#"> 
<!--- outputs LFline1LFline2LFline3LF ---> 
+0

Quelle version CF et OS? –

+0

CF 8, Windows XP Professionnel SP3 Également reproduit sur CF 9. – dmr

+0

Il me semble, basé sur un peu de recherche, que par défaut XML Parsers ne sont pas censés préserver les espaces, puisque la plupart du temps les espaces n'ont aucun sens dans les données et où c'est important (dans la mise en page) est rare. Mais il semble qu'il existe un attribut que vous pouvez définir pour indiquer à l'analyseur de préserver les espaces. Je n'ai aucune idée si cela fonctionne dans ce cas parce que je n'ai aucun des problèmes que vous décrivez sur mon système. ref: http://www.w3.org/TR/REC-xml/#sec-white-space –

Répondre

0

Les analyseurs XML normalisent le CR/LF à LF selon le spec. Pour conserver l'EOL CR/LF, utilisez les références d'entité. Voir ci-dessous:

<cfsavecontent variable="xmlvar"> 
<nodes> 
    <node> 
     line1&#x000D;&#x000A; 
     line2&#x000D;&#x000A; 
     line3&#x000D;&#x000A; 
    </node> 
</nodes> 
</cfsavecontent> 
0

Avez-vous essayé d'utiliser le paramètre charset = « utf-8 » dans la balise cffile?

+0

Ricardo, le problème n'est pas avec le cffile. Voir ma mise à jour – dmr

0

Je ne peux pas reproduire quoi que ce soit dont vous parlez avec ColdFusion 9.0.1 sur Mac OSX. Les espaces blancs sont préservés au fur et à mesure. J'ai essayé les deux exemples ci-dessus et ils ont fonctionné (la plupart du temps) comme prévu. En fait, je n'ai vu aucun CR dans les remplacer(), je n'ai vu que des LF. Mais il les a tous maintenus.

+0

OSX n'utilise pas CR/LF comme marqueur EOL. Wikipedia a une liste de caractères EOL et les systèmes qui les utilisent: http://en.wikipedia.org/wiki/Newline#Representations –

Questions connexes