2009-12-17 5 views
1

Pourriez-vous s'il vous plaît corriger mon code ci-dessous.Comment puis-je écrire des données XML dans un fichier avec Perl?

#!/usr/local/bin/perl 

open (MYFILE, '>>data.xml'); 
print MYFILE "<?xml version="1.0" encoding="UTF-8"?>\n"; 
close (MYFILE); 

Mis à jour.

#!/usr/local/bin/perl 
open (MYFILE, '>>data.xml'); 
print MYFILE '<?xml version="1.0" encoding="UTF-8"?\>'."\n"; 
print MYFILE '<?xml version="1.0" encoding="UTF-16"?\>'."\n"; 
close (MYFILE); 

sortie: fonctionne bien maintenant.

<?xml version="1.0" encoding="UTF-8"?\> 
<?xml version="1.0" encoding="UTF-16"?\> 

MAIS.

#!/usr/local/bin/perl 
open (MYFILE, '>>data.xml'); 
print MYFILE '<?xml version="1.0" encoding="UTF-8"?\>'.'\n'; 
print MYFILE '<?xml version="1.0" encoding="UTF-16"?\>'.'\n'; 
close (MYFILE); 

Sortie: # Format d'erreur avec \ n

<?xml version="1.0" encoding="UTF-8"?\>\n<?xml version="1.0" encoding="UTF-16"?\>\n 
+0

Qu'est-ce qui ne va pas –

+0

-je? Bonjour, je vais essayer un par un, merci à tous, merci –

+1

Comme je l'ai dit dans un commentaire ci-dessous, si vous mettez des guillemets simples, cela affichera deux caractères plutôt que –

Répondre

5
print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n}; 

Votre problème est que vous aviez niché entre guillemets; l'utilisation de qq{} pour délimiter la chaîne résoudra ce problème.

+0

Si vous utilisez des guillemets simples, le \ n ne fonctionnera pas. –

+0

@Paul Je me suis corrigé. Merci! – ennuikiller

+1

@ennuikiller: Vous réalisez que vous pouvez utiliser 'qq', j'espère. –

3

Je recommande d'utiliser:

use XML::Simple; 
+0

@Jay: Pourriez-vous poster un exemple simple en utilisant 'XML :: Simple'? – Zaid

+0

@Zaid: Il existe de nombreux tutoriels en ligne, voici l'un des bons: http://www.ibm.com/developerworks/xml/library/x-xmlperl1.html –

+0

XML :: Writer est un autre assez simple – plusplus

1

Voici une partie de la mine pour l'impression d'un fichier XML:

open(XML, ">$xmlfile"); 
print XML (<<EOF); 
<?xml version="1.0" encoding="UTF-8"?> 
<gpx 
version="1.1" 
creator="Navaid Waypoint Generator - http://navaid.com/GPX/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.topografix.com/GPX/1/1" 
xmlns:navaid="http://navaid.com/GPX/NAVAID/1/0" 
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd 
http://navaid.com/GPX/NAVAID/1/0 http://navaid.com/GPX/NAVAID/1/0"> 
<metadata> 
    <author> 
     <name>Paul Tomblin</name> 
     <email id="ptomblin" domain="xcski.com"/> 
     <link href="http://blog.xcski.com/"/> 
    </author> 
    <link href="http://navaid.com/GPX/"/> 
</metadata> 
EOF 
+0

Pourquoi la downvote? Il illustre que vous pouvez éviter les problèmes de citation en utilisant un document ici. Si vous pensez que je suis en quelque sorte un proxénète sur mon site de logiciel * gratuit *, je peux en retirer les références si vous le souhaitez, mais ce n'est pas comme si j'allais atteindre le public attendu en le postant sur un site de programmation . –

+0

un bon moyen aussi. Merci. –

+0

Downvote par un autre invité. Je cours juste le script ci-dessus. il fonctionne maintenant. Je suis également d'accord avec le fait que c'est un bon moyen d'éviter les problèmes de devis ... :-) –

6

Le problème est que vous avez des citations unescaped dans la chaîne. Soit échapper aux citations en utilisant la barre oblique inverse ou entourer votre chaîne d'impression avec qq {}:

print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n}; 
--or-- 
print MYFILE "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 
1

toujours, toujours, toujours vérifier la valeur retournée par open, par exemple ,

open (MYFILE, '>>data.xml') 
    or die "$0: open: $!"; 

Notez les bits importants dans le message d'erreur:

  1. le nom du programme qui a échoué, $0
  2. ce qu'il essayait de faire, open
  3. pourquoi il a échoué , $!

Sans retour à la ligne fin de la chaîne passée à die, il ajoute le fichier et le numéro de ligne où votre programme est mort.

5

toujours tour sur les avertissements et les rétrécissements, vous trouverez plus tôt ce qui a mal tourné, et obtenir plus de détails pourquoi:

#!/usr/local/bin/perl 
use strict; 
use warnings; 

Utilisez toujours la forme lexicale-variabled, trois arguments de open (il y a big discussion why over here), et vérifiez toujours la valeur de retour (il retournera une erreur si quelque chose a mal tourné, et mettre la raison dans la variable $! (see under $! at perldoc perlvar) .De plus, die affichera le numéro de la ligne où le programme se termine si vous ne le faites pas finissez votre chaîne avec un \n (plus à perldoc -f die).

open my $file, '>>', 'data.xml' or die "Can't open file: $!"; 

Et utiliser des guillemets doubles autour de la \n afin qu'il soit imprimé correctement:

print $file '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; 
print $file '<?xml version="1.0" encoding="UTF-16"?>' . "\n"; 
close $file; 
+0

+1 pour des recommandations pour aider à l'avenir. –

+0

+1 pour la description détaillée. –

0

Plusieurs points supplémentaires de conseils:

  • Pour l'écriture complexe, structurés fichiers, utiliser une bibliothèque comme XML::Simple ou l'un des many, many others available on CPAN.

  • Si vous écrivez beaucoup de fichiers très similaires, un module de modèle peut être plus approprié.

  • Prenez le conseil d'Ether au sujet de: open, strict et warnings. Cela vous permettra de gagner du temps lors du débogage.

  • Si vous voulez affirmer qu'un fichier a un codage particulier (UTF-8 ou UTF-16), vous devriez probablement ajouter emit actual Unicode text au fichier. Il y a plus d'informations dans perldoc -f open.

+0

@Peter, merci pour l'édition. – daotoad

1

Si vous souhaitez écrire des données UTF-8 dans un fichier (comme vous le dites dans votre déclaration XML, ouvrez le fichier avec un encodage UTF-8:

open my($fh), '>:utf8', 'data.xml' or die "Could not open file: $!"; 

print $fh qq{<?xml version="1.0" encoding="UTF-8">\n}; 
Questions connexes