in reply to Is there any XML reader like this?
As always, I strongly recommend against XML::Simple. XML::Simple might seem simple until you end up in a situation where one of your stations has only a single IP address, and you end up with:
{
servers => {
station19 => {ip=>['10.10.10.1','10.10.10.2']},
station20 => {ip=>['10.10.10.3','10.10.10.4']},
station21 => {ip=>'10.10.10.5'}, # D'oh!
}
}
Notice that $hash->{servers}{station21}{ip} is not an arrayref, whereas the IP list is an arrayref for every other station.
OK, so you can configure XML::Simple to force the IP addresses to always be arrayrefs, but by the time you've thought through every possible permutation of your data, XML::Simple becomes not so simple any more.
Better to use a more powerful XML module, like XML::LibXML, which might seem more complicated to begin with, but is at least consistent.
use XML::LibXML; my $xml = XML::LibXML->new->parse_fh(\*DATA); foreach my $station ($xml->findnodes('/servers/*')) { printf("Station: %s\n", $station->tagName); foreach my $ip ($station->findnodes('./ip')) { printf("\tIP: %s\n", $ip->textContent); } } __DATA__ <servers> <station18> <ip>10.0.0.101</ip> <ip>10.0.1.101</ip> <ip>10.0.0.102</ip> <ip>10.0.0.103</ip> <ip>10.0.1.103</ip> </station18> <station19> <ip>10.0.0.111</ip> <ip>10.0.1.111</ip> <ip>10.0.0.112</ip> <ip>10.0.0.113</ip> <ip>10.0.1.113</ip> </station19> <station17> <ip>10.0.0.121</ip> <ip>10.0.1.121</ip> <ip>10.0.0.122</ip> <ip>10.0.0.123</ip> <ip>10.0.1.123</ip> </station17> <station20> <!-- no IP addresses --> </station20> <station21> <!-- just one IP address --> <ip>10.2.1.123</ip> </station21> </servers>
|
|---|