2009-08-23 16 views
1

Wie kann ich ein Perl-Array wie diese diese XML-SchnipselWie kann ich mein Perl-Array in XML umwandeln?

@categories = (["Technology", "Gadgets"], ["TV & Film"]); 

und generieren?

<itunes:category text="Technology"> 
    <itunes:category text="Gadgets"/> 
</itunes:category> 
<itunes:category text="TV &amp; Film"/> 

Ich kann das Array ändern, wenn es einen einfacheren Weg gibt, um zum selben Ausgang zu gelangen.

Antwort

1

Für einen allgemeinen Ansatz der XML-Generierung mit Perl sehen Sie sich XML::Generator oder XML::Writer.

+0

ein besonderer Grund für den downvote? – Inshallah

+0

War ich nicht, aber wahrscheinlich für den Umgang mit XML als Text und nicht über eines der vielen, vielen Module, die kein schlechtes XML generieren. –

+0

Ich habe zwei Vorschläge gemacht (XML :: Generator und XML :: Writer), obwohl ich nicht sicher bin, ob und wie viel sie überprüfen. Und um schlechtes XML zu erzeugen, erzeugt der Code in meiner Antwort * keine * schlechte XML ** für diese spezielle Eingabe ** :-). – Inshallah

1

Für den Anfang würde ich definitiv das Array ändern. (Es gibt keine eindeutige Zuordnung zwischen den Daten und dem gewünschten XML-Fragment.)

So etwas wie die folgende POO-Darstellung?

my $categories = { 
    "Technology" => { 
     "Gadgets" => undef 
    }, 
    "TV & Film" => undef 
}; 
4

Ich glaube tatsächlich, XML :: Simple ist eine der einfachsten XML-Module ist abhängig zu verwenden, was Sie brauchen.

Das Snippet, auf das Sie oben verweisen, ist jedoch kein gültiges XML, das kein Root-Tag hat. Möchten Sie das Snippet oder ein vollständig gültiges XML-Dokument generieren?

XML :: Generator ist ein weiterer guter. Keines davon wird jedoch den Snippet generieren, den Sie dort haben, da sie ein Root-Tag enthalten.

Ihre Motivation für die Frage in Ihrem Kommentar Da unten Sie betrachten möchten: Mac::Itunes::Library::XML

Und als allgemeine logische Folge: Die meiste Zeit, wenn sie mit perl search.cpan.org Umgang finden Sie, was Sie brauchen und http://cpanratings.perl.org/ werden Ihnen zeigen, wie gut erhalten etwas von der Gemeinschaft ist, wenn es viele Optionen gibt.

+0

Ich bin nur auf der Suche nach dem Schnipsel an dieser Stelle. Das Hauptziel des Codes besteht jedoch darin, ein vollständiges XML-Dokument zu erstellen, das wie folgt aussieht: http://www.apple.com/itunes/whatson/podcasts/specs.html#example Ich erhalte eine Liste mit MP3-Dateien ein Verzeichnis, das Datum und Dateigröße sowie Werte aus den ID3-Tags liest. Wenn jemand eine bessere Lösung dafür hat, bin ich ganz Ohr. – JustinStolle

+0

Das Mac :: iTunes-Zeug ist wirklich alt und funktioniert wahrscheinlich nicht mehr. Die letzte Version von iTunes, die es zu handhaben versuchte, war Version 4. –

2

Ich weiß nicht, warum Inshallla Antwort wurde downvoted, weil XML::Generator & XML::Writer sind beide gute Module zum Schreiben von XML.

Mit der Whats on iTunes? spec Sie dann kommentierte dies ist, wie es mit Hilfe von XML aussehen könnte :: Generator:

use strict; 
use warnings; 
use XML::Generator; 

my $x = XML::Generator->new(pretty => 2, conformance => 'strict'); 

my $itunes_ns = [ 'itunes' => 'http://www.itunes.com/dtds/podcast-1.0.dtd' ]; 

say $x->xmldecl(encoding => 'UTF-8'); 
say $x->rss( 
    $x->channel(
     $x->title('All about Everything'), 

     $x->category($itunes_ns, { text => 'Technology' }, 
      $x->category($itunes_ns, { text => 'Gadgets' }), 
     ), 

     $x->category($itunes_ns, { text => 'TV & Film' }), 
    ), 
); 


Dies erzeugt:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"> 
    <channel> 
    <title>All about Everything</title> 
    <itunes:category text="Technology"> 
     <itunes:category text="Gadgets" /> 
    </itunes:category> 
    <itunes:category text="TV & Film" /> 
    </channel> 
</rss> 


die beantworten "Perl-Array in XML umwandeln", dann hier ein Beispiel:

use strict; 
use warnings; 
use XML::Generator; 

my $x = XML::Generator->new(pretty => 2, conformance => 'strict'); 

my $itunes_ns = [ 'itunes' => 'http://www.itunes.com/dtds/podcast-1.0.dtd' ]; 

my @categories = ({ "Technology" => [ "Gadgets", 'Gizmo' ] }, "TV & Film"); 

say $x->xmldecl(encoding => 'UTF-8'); 
say $x->rss( 
    $x->channel(
     $x->title('All about Everything'), 

     map { recurse($_) } @categories, 
    ), 
); 

sub recurse { 
    my $item = shift; 
    return $x->category($itunes_ns, { text => $item }) 
     unless ref $item eq 'HASH'; 

    my ($k, $v) = each %$item; 
    return $x->category($itunes_ns, 
         { text => $k }, 
         map { recurse ($_) } @$v); 
} 


Schauen Sie sich die vorherige Frage SO something a bit similar

Verwandte Themen