2013-07-14 2 views
-1

У меня есть данные XML исходя из сокетаXML Parser из командной строки в Perl

{

my $xmlstr = "<ClearQuest login='XXXX' password='XXXX' db='XXX' repo='XXX'><defect id='dts0100' action='view' wait='yes'> </defect> </ClearQuest> ";    # read in str (or entire fh) 
    my $exit = 0;        # default exit val = okay 
    my @cmdout =();       # init command output 
    my $server = 'ABCSERVER';   # cq server 
    my $eof = '</ClearQuest>';    # end of data tag 
    my $port = 5555;       # port address of server 
    my $proto = getprotobyname('tcp');  # get protocol num for tcp 
    my $iaddr = inet_aton($server);   # convert hostname to bin ip 
    my $paddr = sockaddr_in($port, $iaddr); # resolve socket address 

               # create socket 
    socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die("socket: $!"); 
               # connect to socket 
    connect(SOCK, $paddr); #or die("$errhdr unable to connect to '$server'!\n"); 
    autoflush SOCK 1;       # don't buffer to socket 
    print(SOCK "$xmlstr\n");     # send command through socket 
    print "DONE"; 
    shutdown(SOCK, 1);  # we're done writing if enabled 

    while ($_ = <SOCK>)      # while data in socket 
    { 
     if ($_ =~ /status='error'/o)   # error detected 
     { 
      print "error!!!"; 
      $exit = 1;       # set bad exit val 
     } 
     push(@cmdout, $_);  # save command output 
     last if ($_ =~ /$eof/);   # stop read if end of data 
    } 
    close(SOCK);   

}

Я хочу Разобрать массив @cmdout для извлечения возвращенных данных.

Вот пример из возвращаемых данных

`

<ClearQuest db='XXX' login='XXXX' cqtan='1319' client='XXX.com' ip=''> 
    <defect id='dts0100' action='view' status='ok'> 
    <component>RA_Checks</component> 
    <description>Please, discuss before resolution.</description> 
    <headline>[CSV] Got a warning </headline> 
    <id_short>799</id_short> 
    <owner>ABC</owner> 
    <planned_release.name>2013</planned_release.name> 
    </defect> 
</ClearQuest> 

`

Я попытался использовать XML :: Parser & XML :: Simple, но не работал ,, парсят только первая строка ... Может ли кто-нибудь помочь мне извлечь данные из массива @cmdout ???

ответ

1

Вы должны присоединиться к вашему @cmdout массиву перед разбором:

use XML::Simple; 
my $cmd = join("", @cmdout); 
my $ref = XMLin($cmd); 
+0

он не смог получить близкие тег любого из выходных элементов –

Смежные вопросы