2009-06-22 4 views
1

J'utilise XML :: Simple et j'ai la structure XML suivante dans une variable xmldata de $ que je dois accéder par le biais du code Perl.Comment puis-je accéder à des données profondes dans une structure XML imbriquée dans Perl en utilisant XML :: Simple?

<root> 
    <a>sfghs</a> 
    <b>agaga</b> 
    <c> 
     <c1>sgsfs</c1> 
     <c2>sgsrsh</c2> 
    </c> 
    <d> 
     <d1>agaga</d1> 
     <d2>asgsg</d2> 
    </d> 
</root> 

Je peux accéder à la valeur de a et b en utilisant le code suivant:

$aval = $xmldata->{a}[0]; 
$bval = $xmldata->{b}[0] ; 

Maintenant, ma question est: comment puis-je obtenir la valeur de dire, d2?

+0

J'ai supprimé ma réponse. Vous devriez marquer la réponse de newt comme la bonne parce qu'elle résout votre problème. –

Répondre

5

Compte tenu de ce que vous avez ci-dessus, je suppose que vous avez le drapeau ForceArray activé. Les clés imbriquées sont stockées sous forme de hachages de hachages à l'aide de références.

Ainsi, pour accéder à 'd2' vous devez utiliser:

my $d2val = $xmldata->{d}[0]->{d2}[0]; 

(ou ma préférence)

my $d2val = $xmldata->{d}->[0]->{d2}->[0]; 

(car il fait déréférencer évident)

De toute évidence, Plus vous allez loin, plus c'est effrayant. C'est l'une des raisons pour lesquelles je suggère presque toujours XML::LibXML et XPath au lieu de XML :: Simple. XML :: Simple devient rapidement pas simple. XML::Simple docs explique comment diverses options peuvent affecter cette mise en page.

Data::Dumper est inestimable quand vous voulez jeter un oeil à la façon dont les données sont disposées.

+0

@newt FYI: J'ai supprimé ma réponse et j'ai placé l'entrée Data :: Dumper ici pour qu'il y ait une réponse complète qui puisse être marquée comme correcte. Si –

+1

pas mon $ d2val = $ xmldata -> { 'd'} [0] { 'd2'} [0] ;? (La différence dans le [0] après { 'd'}, toujours Asuming ForceArray => 1.) Pour des documents plus volumineux J'aime XML :: Parser :: PerlSAX (quoi que vous fassiez, une fois que vos documents deviennent grands ne pas les DOM -parse les). – Anon

+0

@Anon, oui vous avez absolument raison. Mon erreur. Corrigé la réponse –