2014-03-31 2 views
2

У меня есть подпрограмма perl, которая предназначена для получения базового документа xml и использования выражений xpath для сбора определенной информации из документа. ЗдесьАнализ XML с Perl с использованием XML :: LibXML :: XPathContext

sub parseXml { 
    my ($rawXml) = @_; 
    print "Raw XML resonse:\n" . $rawXml . "\n"; 

    # Set up the XPath search. 
    my $xp = XML::LibXML::XPathContext->new; 
    my $node = $xp->getContextNode; 
    $xp->setContextNode($node); 

    # Extract a list apiece of ids, whos, and whats. 
    my @ids = $xp->findnodes('//object/void[@property="id"]/int'); 
    my @whos = $xp->findnodes('//object/void[@property="who"]/string'); 
    my @whats = $xp->findnodes('//object/void[@property="what"]/string'); 

    # Iterate over the arrays to print the data. 
    my $it = each_array(@ids, @whos, @whats); 
    while (my ($id, $who, $what) = $it->()) { 
    print sprintf("%2d: ", $id->string_value) . 
     $who->string_value . " -> '" . 
     $what->string_value . "'\n"; 
    } 
} 

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

XPathContext: потерянный узел тока на ... линии 83

Что я сделал неправильно? Я ОЧЕНЬ новичок в perl.

+1

Какая линия 83? – Robin

+0

Кажется, моя догадка о 'getContextNode' была права. ;) –

+0

Это было точно. getContextNode был там, чтобы попробовать другое решение, которое не сработало. Ваше решение, Йенс, было правильным, как есть. В очередной раз благодарим за помощь. Робин, я считаю, что строка 83 была моей $ xp = XML :: LibXML :: XPathContext-> new; –

ответ

3

Вы не разбираете входной XML в любой точке. Учитывая $rawXml является строкой, убедитесь, что сделать это с помощью

my $dom = XML::LibXML->load_xml(string => $rawXml); 
my $xp = XML::LibXML::XPathContext->new($dom); 

Моей догадки линия 83 является my $node = $xp->getContextNode;, которая не как документ в настоящее время пуст. В любом случае вам это не нужно, вместе со следующей строкой.

+0

Вы благословение. Спасибо. Это ответ, и я буду рад отметить его как таковой. Еще раз спасибо. Надеюсь, это поможет и другим. И благодаря тому, что добрался до меня так быстро. Я ценю это. –

+0

В качестве альтернативы, '$ xpc-> findnodes ($ xpath, $ doc);' – ikegami

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