前提:我来自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,<?xml version="1.0" encoding="ISO-8859-1"?>
utf-8 字符都搞砸了。我尝试使用这样的东西
$fxml->setDocumentElement($doc);
$fxml->toFile($path);
但它不起作用。我可以使用一些方法来实现我的(毕竟非常简单的)目标?我已经查看了文档,但找不到任何有用的东西。
编辑
样式表声明必须在<?xml version="1.0" encoding="UTF-8"?>
之后和实际 XML 之前。
将 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);