Как я могу записать данные XML в файл с помощью Perl? - PullRequest
1 голос
/ 17 декабря 2009

Не могли бы вы исправить мой код ниже.

#!/usr/local/bin/perl

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

Обновлен.

#!/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);

вывод: теперь работает хорошо.

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

НО.

#!/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);

Вывод: # формат ошибки с \ n

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

Ответы [ 8 ]

6 голосов
/ 17 декабря 2009

Проблема в том, что в строке есть неэкранированные кавычки. Либо экранируйте кавычки, используя обратную косую черту, либо заключите в строку печати qq {}:

print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n};
--or--
print MYFILE "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
5 голосов
/ 17 декабря 2009

Всегда включите предупреждения и ограничения, чтобы вы раньше узнали, что пошло не так, и получите более подробную информацию, почему:

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

Всегда используйте лексическую переменную, форму с тремя аргументами open (здесь есть большое обсуждение , почему здесь ), и всегда проверяйте возвращаемое значение (оно вернет ошибку, если что-то пошло не так и укажите причину, по которой переменная $! ( см. в разделе $! в perldoc perlvar ). Кроме того, die выведет номер строки, из которой программа вышла если вы не заканчиваете свою строку с \n (больше на perldoc -f die ).

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

И используйте двойные кавычки вокруг \n, чтобы он печатался правильно:

print $file '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
print $file '<?xml version="1.0" encoding="UTF-16"?>' . "\n";
close $file;
5 голосов
/ 17 декабря 2009
print MYFILE qq{<?xml version="1.0" encoding="UTF-8"?>\n};

Ваша проблема в том, что вы вложили двойные кавычки; использование qq{} для разделения строки решит эту проблему.

3 голосов
/ 17 декабря 2009

Я бы порекомендовал использовать:

use XML::Simple;
1 голос
/ 19 декабря 2009

Если вы хотите записать данные UTF-8 в файл (как вы говорите в декларации XML, откройте файл с кодировкой 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};
1 голос
/ 17 декабря 2009

Всегда, всегда, ВСЕГДА проверьте значение, возвращаемое из open, например, ,

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

Обратите внимание на важные биты в сообщении об ошибке:

  1. название программы, которая потерпела неудачу, $0
  2. что он пытался сделать, open
  3. почему это не удалось, $!

Без новой строки в конце строки, переданной в die, он добавляет файл и номер строки, где умерла ваша программа.

1 голос
/ 17 декабря 2009

Вот мой код для печати файла 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 голосов
/ 17 декабря 2009

Несколько дополнительных советов:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...