Sporti69 has asked for the wisdom of the Perl Monks concerning the following question:

Hi all,

How Can I get a list of attributes in an <element> ?
<element type="type" name="name" test="ok">

What for loop prints : "type, name, test" to my screen?

Thanks !

Replies are listed 'Best First'.
Re: XML :: Simple
by runrig (Abbot) on Nov 05, 2008 at 21:12 UTC
    What have you tried so far? Presumably that element is somewhere within the XML document, so first you have to get to the element within the data structure that XML::Simple::XMLout returns. Also, there's no way to tell the difference between attributes and child elements...maybe XML::LibXML would be simpler?
    use XML::LibXML; my $p = XML::LibXML->new(); my $doc = $p->parse_string(<<EOT); <root> <element type="type" name="name" test="ok"/> </root> EOT my $root = $doc->getDocumentElement(); for my $attr ($root->findnodes('//element/@*') print $attr->nodeName(),"\n"; }
      All the perl code underneath has question marks in places where there needs to be a variable, not an exact word like "type" as a reference, a variable reference. So no word that is in my xml should be in the perl scirpt
      <?xml version="1.0" encoding="ISO-8859-1"?> <A> <B> <C> <element type="k" name="p" online="yes"/> <element type="i" name="e" online="yes"/> <element type="y" name="z" online="yes"/> <element type="a" name="q" online="yes"/> <element type="z" name="d" online="yes"/> <element type="t" name="p" online="yes"/> </C> </B> </A>
      And after posting here, and reading some stuff I got to somethings like this. This code needs to be universal, I just don't get it with the referencing thing, if it is necassary. I suppose so. But let me just remark that I need to get down to the attributes, only A B and C will be there as nested elements.
      #!/usr/bin/perl -- use strict; use warnings; use Cwd; use XML::Simple; my $dir = cwd(); opendir(DIR, "."); my @files = grep(/\.xml$/,readdir(DIR)); closedir(DIR); foreach my $file (@files) { my $xs1 = XML::Simple->new(); my $doc = $xs1->XMLin($file, keyattr=>['????????'], ForceContent=>1, F +orceArray=>1); use Data::Dumper; local $Data::Dumper::Indent=1; for my $sub ( sort keys %{ $doc->{???????} } ){ $rowCount = $tellerR; $worksheet->Cells($rowCount, $colCount)->{Value} = $sub; for my $elem ( sort keys %{ $doc->{??????}{$sub} } ){ # More simalar onces ?? Or... for my $element ( @{ $doc->{???????}{$sub}{$elem} } ){ } } } }
        my $doc = $xs1->XMLin($file, keyattr=>[], ForceContent=>1, ForceArray= +>1); for my $attribs ( @{$doc->{B}[0]{C}[0]{element}} ) { print "$_: $attribs->{$_}\n" for keys %$attribs; }