2

前提:我来自 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 之后和之前。

4

1 回答 1

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);
于 2012-10-05T11:50:34.023 回答