2015-02-16 2 views
2

Я пытаюсь проанализировать следующий XML. Проблема в том, я ничего не получаю на выходе:Perl-скрипт для анализа XML с использованием XML :: Simple

XML файл:

<response> 
    <response-name>SendUnitaryResponse</response-name> 
    <params> 
     <request-status>OK</request-status> 
     <unitary-request-id>B4004A3E</unitary-request-id> 
    </params> 
</response> 

Сценарий:

use XML::Simple; 
use Data::Dumper; 
my $access = XMLin('C:\Users\s.baccar\Desktop\access.log'); 
print $access->{response}->{response-name}; 

ответ

1

XML::Simple - это не так. Это простой XML.

В это документации говорится:

Использование этого модуля в новом коде не рекомендуется. Доступны и другие модули, которые обеспечивают более простые и последовательные интерфейсы.

Вместо этого, я хотел XML::Twig (другие варианты существуют):

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

my $xml = q{<response> 
    <response-name>SendUnitaryResponse</response-name> 
    <params> 
     <request-status>OK</request-status> 
     <unitary-request-id>B4004A3E</unitary-request-id> 
    </params> 
</response>}; 

my $twig_parser = XML::Twig -> new -> parse ($xml); 
#in XML::Twig - root is the 'top' node, e.g. <response> in this case. 
print $twig_parser -> root -> first_child_text('response-name'); 

Это также работает, если вы даете ему имя:

my $twig_parser = XML::Twig -> new -> parsefile ('C:\Users\myuser\Documents\test.xml'); 
print $twig_parser -> root -> first_child_text('response-name'); 
+0

Я проверяю ваш код нормально, я получил ОК на выходе, но я ничего не получил –

+0

Я проверил и запустил код, который я дал. Он работает с образцом ввода, печать «SendUnitaryResponse» – Sobrique

+0

Да, это работает, спасибо вам очень mych. –

3

Как Sobrique указывает на то, XML :: Simple не так просто. В этом случае он удаляет корневой элемент (<response>), поэтому ваш оператор печати не работает. Вы можете изменить свой отпечаток:

print $access->{response-name}; 

... или сказать XML :: Simple, чтобы корневой элемент:

my $access = XMLin('C:/Users/s.baccar/Desktop/access.log', KeepRoot => 1); 

... или лучше всего использовать другой модуль.

1

В дополнение к тому, что другие люди говорят, пожалуйста use strict;use warnings;)

Если добавить те в сценарий, я получаю:

Bareword "response" not allowed while "strict subs" in use at x.pl line 8. 
Bareword "name" not allowed while "strict subs" in use at x.pl line 8. 

(Обратите внимание, что строка 8 является print $access->{response}->{response-name};)

Эта линия фактически превращается в print $access->{response}->{0};

Вам необходимо использовать 'response-name'.

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