我使用这个perl代码从文件中读取XML,然后写入另一个文件(我的完整脚本包含添加属性的代码):
#!usr/bin/perl -w
use strict;
use XML::DOM;
use XML::Simple;
my $num_args = $#ARGV + 1;
if ($num_args != 2) {
print "\nUsage: ModifyXML.pl inputXML outputXML\n";
exit;
}
my $inputPath = $ARGV[0];
my $outputPath = $ARGV[1];
open(inputXML, "$inputPath") || die "Cannot open $inputPath \n";
my $parser = XML::DOM::Parser->new();
my $data = $parser->parsefile($inputPath) || die "Error parsing XML File";
open my $fh, '>:utf8', "$outputPath" or die "Can't open $outputPath for writing: $!\n";
$data->printToFileHandle($fh);
close(inputXML);
然而,这不会保留像换行符这样的字符。例如,这个XML:
<?xml version="1.0" encoding="utf-8"?>
<Test>
<Notification Content="test1 testx 
test2
test3
" Type="Test1234">
</Notification>
</Test>
成为这个:
<?xml version="1.0" encoding="utf-8"?>
<Test>
<Notification Content="test1 testx
test2
test3
" Type="Test1234">
</Notification>
</Test>
我怀疑我没有正确地写文件。
答案 0 :(得分:4)
例如,使用XML::LibXML。涉及的主要模块是XML::LibXML::Parser和XML::LibXML::DOM(以及其他模块)。返回的对象通常为XML::LibXML::Document
use warnings 'all';
use strict;
use XML::LibXML;
my $inputPath = 'with_encodings.xml';
my $outputPath = 'keep_encodings.xml';
my $reader = XML::LibXML->new();
my $doc = $reader->load_xml(location => $inputPath, no_blanks => 1);
print $doc->toString();
my $state = $doc->toFile($outputPath);
我们不必先创建一个对象,但可以直接说XML::LibXML->load_xml
。我这样做是因为这样可以在解析之前但在构造函数之外使用$reader
上的方法来设置编码(例如)。
此模块也更便于处理。
XML::Twig也应该留下编码,并且处理起来也好得多。
答案 1 :(得分:-1)
仅供参考,我能够通过切换到不同的XML解析器来实现这一点。现在使用XML :: LibXML。
语法类似,除了它是'parse_file'而不是'parsefile',而不是'printToFileHandle'你用'toFile'和文件名。