Premessa: vengo da C ++ e sono piuttosto noob in Perl. Sto cercando di aggiungere una dichiarazione del foglio di stile a un dato .xml
file. Il .xml
il file viene creato da una terza parte e scaricato da parte; non stiamo mettendo in discussione la correttezza né la ben formata XML. Inoltre, non possiamo sapere se l'XML nel file è rientrato o in una riga.
Non essendo in grado di manipolare il file ordinatamente solo con Perl, ho preso XML :: LibXML ma sono ancora bloccato, questo è ciò che ho fatto finora.
#!/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;
Con questo ottengo solo l'XML senza la dichiarazione iniziale <?xml version="1.0" encoding="ISO-8859-1"?>
e i caratteri utf-8 sono tutti incasinati. Ho provato ad usare qualcosa di simile
$fxml->setDocumentElement($doc);
$fxml->toFile($path);
ma non funziona. C'è qualche metodo che potrei usare per raggiungere il mio obiettivo (dopotutto piuttosto semplice)? docs ma non riesco a trovare nulla di utile.
MODIFICARE
La dichiarazione del foglio di stile deve essere dopo il<?xml version="1.0" encoding="utf-8"?>
e prima del vero XML.
risposte:
2 per risposta № 1Cambia l'inizializzazione di fxml in
my $fxml = XML::LibXML->load_xml(location => $path);
Non stai caricando il file originale da nessuna parte.
Aggiornare
È possibile inserire il nodo prima l'elemento radice usando 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);