I am trying to extract node values from an XML file using LibXML. When I call findvalue all of the nodes of the same element type are concatenated. I am totally new to using LibXML and I'm not the sharpest with Perl. Unfortunately the xml isn't the best. How can I extract single nodes?
Below is sample XML and the output. The XML is a snippet from an iTunes library export.
<playlists>
<dict>
<key>Name</key><string>Yes - Tales From Topographic Oceans</string>
<key>Description</key><string></string>
<key>Playlist ID</key><integer>67312</integer>
<key>Playlist Persistent ID</key><string>F28F195257143396</string>
<key>All Items</key><true/>
<key>Playlist Items</key>
<array>
<dict>
<key>Track ID</key><integer>25912</integer>
</dict>
<dict>
<key>Track ID</key><integer>25914</integer>
</dict>
<dict>
<key>Track ID</key><integer>25916</integer>
</dict>
<dict>
<key>Track ID</key><integer>25918</integer>
</dict>
</array>
</dict>
<dict>
<key>Name</key><string>Yes - Yessongs</string>
<key>Description</key><string>Live Album</string>
<key>Playlist ID</key><integer>67319</integer>
<key>Playlist Persistent ID</key><string>405B144877D8B8E4</string>
<key>All Items</key><true/>
<key>Playlist Items</key>
<array>
<dict>
<key>Track ID</key><integer>25920</integer>
</dict>
<dict>
<key>Track ID</key><integer>25922</integer>
</dict>
<dict>
<key>Track ID</key><integer>25924</integer>
</dict>
<dict>
<key>Track ID</key><integer>25926</integer>
</dict>
<dict>
<key>Track ID</key><integer>25928</integer>
</dict>
<dict>
<key>Track ID</key><integer>25930</integer>
</dict>
</array>
</dict>
</playlists>
my $dom = XML::LibXML->load_xml(location => $playlistxml);
foreach my $title ($dom->findnodes('//playlists/dict')) {
my $nodestring = $title->findvalue('./string');
print $nodestring, "\n";
foreach my $tracks ($title->findnodes('//playlists/dict/array')) {
my @trackid = $tracks->findvalue('./dict/integer');
print @trackid, "\n";
}
}
This is the generated Output:
Yes - Tales From Topographic OceansF28F195257143396
25912259142591625918
259202592225924259262592825930
Yes - YessongsLive Album405B144877D8B8E4
25912259142591625918
259202592225924259262592825930
Desired output:
Yes - Tales From Topographic Oceans
25912
25914
25916
25918
Yes - YessongsLive Album
25920
25922
25924
25926
25928
25930
Any help would be most appreciated