前提:我来自C ++,而且我在Perl非常棒。
我正在尝试将样式表声明添加到给定的.xml
文件中。 .xml
文件由第三部分创建并下载到一边;我们不会质疑XML的正确性和良好性。我们也不知道文件中的XML是缩进的还是单行的。
无法仅使用Perl整齐地操作文件,我使用了XML :: LibXML,但我仍然卡住了。到目前为止,这是我所做的。
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
my $path = './file.xml';
my $fxml = XML::LibXML::Document->new('1.0','utf-8');
my $pi = $fxml->createPI("xml-stylesheet");
$pi->setData(type=>'text/xsl', href=>'trasf.xsl');
$fxml->appendChild($pi);
$XML::LibXML::skipXMLDeclaration = 1;
my $docwodecl = XML::LibXML::Document->new;
$docwodecl = $doc->toString;
open my $out_fh, '>', $path;
print {$out_fh} $final_xml.$docwodecl;
close $out_fh;
有了这个,我只得到没有初始声明<?xml version="1.0" encoding="ISO-8859-1"?>
的XML,并且utf-8字符都搞砸了。
我试过用这样的东西
$fxml->setDocumentElement($doc);
$fxml->toFile($path);
但它不起作用。 有一些方法我可以用来完成我(毕竟非常简单)的目标?我看过docs,但找不到任何有用的东西。
<?xml version="1.0" encoding="UTF-8"?>
之后和实际XML之前。
答案 0 :(得分:2)
将您的fxml初始化更改为
my $fxml = XML::LibXML->load_xml(location => $path);
您没有在任何地方加载原始文件。
您可以使用insertBefore
在根元素之前插入节点:
my $path = '1.xml';
my $fxml = XML::LibXML->load_xml(location => $path);
my $pi = $fxml->createPI('xml-stylesheet');
$pi->setData(type => 'text/xsl', href => 'trasf.xsl');
$fxml->insertBefore($pi, $fxml->documentElement);