Thread skript-fehlersuche
(23 answers)
Opened by turbo at 2011-11-25 15:24
Das Problem ist, dass LibXML für eine Objekt nur einmal eine Datei parsed. (Ich meine mich zu erinnern, dass alle weiteren Geparsten Strukturen werden an die vorhanden angehängt, aber genau weiß ich es nicht.) Wenn man das selbe Objekt für ein anderes XML verwenden will muss man das Objekt "zurück setzen".
Einfacher ist es ein neues Objekt zu erzeugen. Hier mal der Code etwas aufgeräumt. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 #!/usr/bin/perl use strict; use warnings; use XML::LibXML; use LWP::UserAgent; #-- Parameter ---------------------------------------------------------# my $strTempFileName = '/tmp/wowza%s.xml'; my $strURL = 'http://%s:8086/connectioncounts.xml'; my $strLogger = '/var/log/wowzaGrabber.log'; my $strType = "Customer"; my $strStreamorCustomerElement = "ConnectionsCurrent"; my $pass = "passwd"; my $user = "user"; my $port = "port"; #----------------------------------------------------------------------# my $strKundeorStream = shift(@ARGV); my @strServerIp = @ARGV; my $httpGet = LWP::UserAgent->new; $httpGet->agent('ReportsBot/1.01'); for my $strItem (@strServerIp) { my $strUrl = sprintf($strURL,$strItem); my $strTempFile = sprintf($strTempFileName,$strItem); #-Get Datasource-----------------------------------------------------# $httpGet->credentials( "$strItem:$port", 'Wowza Media Systems', $user, $pass ); my $response = $httpGet->get($strUrl); if($response->is_error()) { warn("ERROR load XML: ($strItem) ". $response->status_line() ); next; } #-Write Tempfile-----------------------------------------------------# if( open(my $fh, '>', $strTempFile) ) { print $fh $response->decoded_content; close $fh; } else { warn("ERROR OPEN $strTempFile ($!)\n"); } #-MAIN---------------------------------------------------------------# my $output = parseXml( $response->decoded_content, $strKundeorStream, $strStreamorCustomerElement, $strType ); print $output; } ######################################################################## sub parseXml { my $strContent=shift; my $strKundeorStream = shift; my $strStreamorCustomerElement = shift; my $strType = shift; my $xmlStruct = XML::LibXML->load_xml(string => $strContent); unless($xmlStruct) { warn("ERROR PARSE XML!"); return ''; } my $xmlRootElement = $xmlStruct -> getDocumentElement(); my $xmlRootElementName = $xmlRootElement -> getName(); my $strLine = ""; foreach my $ChildElement ($xmlRootElement->getElementsByTagName("Application")) { my @arrNodes = $ChildElement->getElementsByTagName("Name"); if ($arrNodes[0]->getFirstChild->getData eq $strKundeorStream) { my @arrNodes = $ChildElement->getElementsByTagName($strStreamorCustomerElement); $strLine = $arrNodes[0]->getFirstChild->getData; last; } } return $strLine; } |