Разбор XML-файла с использованием Perl - PullRequest
3 голосов
/ 25 марта 2011

Я пытаюсь извлечь значение двух конкретных атрибутов из файла XML, структура которого приведена ниже;

<environment>
    <applications>
       <application1>
          <app-config>
             <server host="boxA" port="1234"/>
           </app-config>
       </applicaitons> 
</environment>

Я хочу иметь возможность прочитать значение атрибута «хост» и «порт».

Я попробовал следующий фрагмент кода, но у меня это не работает.

#!/usr/local/bin/perl -w

use XML::XPath;

my $file = "configuration.xml";
my $xp = XML::XPath->new(filename => $file);

my $hname = $xp->find('/environment/applications/application1/app-config/server/@host');
my $pnumber = $xp->find('/environment/applications/application1/app-config/server/@port');


print $hname;

Но это не возвращает никакого вывода, когда я запускаю эту команду.

Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 25 марта 2011

Ваш XML неверен!Исправьте это, и он отлично работает.

4 голосов
/ 25 марта 2011

Всегда, всегда начинайте свои Perl-скрипты с;

use strict;

И во время отладки тоже сделайте это;

use warnings;

Это покажет вам, что ваш XML изначально искажен.

Исправьте ваш XML, и он будет работать!

2 голосов
/ 25 марта 2011

</applicaitons> следует записать как </applications> Замените это в своем XML-документе. Источник в порядке.

0 голосов
/ 25 марта 2011

Использовать XML: просто. Это, ну, просто.

Попробуйте следующий код:

use strict;
use warnings;
use XML::Simple;
my $xml = XMLin( <<XML );
<environment>
    <applications>
       <application1>
          <app-config>
             <server host="boxA" port="1234"/>
           </app-config>
       </applicaitons> 
</environment>
XML
print $xml->{"applications"}{"app-config"}{"server"}{"host"} . "\n";
print $xml->{"applications"}{"app-config"}{"server"}{"port"} . "\n";

в вашем фрагменте XML вы получите ошибку, такую ​​как:

mismatched tag at line 7, column 9, byte 159 at C:/Perl64/lib/XML/Parser.pm line 187

так как он говорит мне, что есть несоответствующий тег, я начинаю изучать XML, пока не решу проблемы с ошибками, поэтому я работаю над ошибками XML, пока не придумаю:

use strict;
use warnings;
use XML::Simple;
my $xml = XMLin( <<XML );
<environment>
    <applications>
          <app-config>
             <server host="boxA" port="1234"/>
           </app-config>
       </applications> 
</environment>
XML
print $xml->{"applications"}{"app-config"}{"server"}{"host"} . "\n";
print $xml->{"applications"}{"app-config"}{"server"}{"port"} . "\n";

А теперь программа выдает ожидаемое:

boxA
1234

Как видите, это помогло мне быстро обнаружить источник ошибки и без дополнительной настройки XML :: Simple сделал очень естественное отображение хешей perl, которые мы все так любим :-) ... simple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...