Perl XML :: Twig вопрос, пожалуйста - PullRequest
3 голосов
/ 13 апреля 2011

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

Поэтому я хочу использовать XML :: Twig, чтобы найти значение «This_Is_My_Name», которое является дочерним значением тега «MyClass.Name». Я думаю Я могу сделать эту часть, но руководство будет оценено.

Затем я хочу получить значение LinkValue «MyClass.Code», которое в приведенном ниже примере равно «987654321».

Надеюсь, это имеет смысл. Так что я не уверен, как двигаться таким образом.

Пожалуйста, помогите:)

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

<Object Class="MyClass" Id="123456789">
    <Property Name="MyClass.Link">
        <LinkValue>
            <Id>2468</Id>
        </LinkValue>
    </Property>
    <Property Name="MyClass.Code">
        <LinkValue>
            <Id>987654321</Id>
        </LinkValue>
    </Property>
    <Property Name="MyClass.Name">
        <StringValue>This_Is_My_Name</StringValue>
    </Property>
</Object>

Ответы [ 2 ]

9 голосов
/ 13 апреля 2011

Вы можете использовать xpaths для извлечения этих значений.Xpath для This_Is_My_Name равен /Object/Property[@Name="MyClass.Name"]/StringValue, а для LinkValue - /Object/Property[@Name="MyClass.Code"]/LinkValue/Id.Код будет:

use XML::Twig;

my $twig = XML::Twig->new();

# parse the file
$twig->parsefile("x.xml");

# look for StringValue
@nodes=$twig->findnodes('/Object/Property[@Name="MyClass.Name"]/StringValue');
$stringVal=pop(@nodes)->text();
print $stringVal."\n";

# look for LinkValue
@nodes=$twig->findnodes('/Object/Property[@Name="MyClass.Code"]/LinkValue/Id');
$linkVal=pop(@nodes)->text();
print $linkVal;
4 голосов
/ 13 апреля 2011

В этом случае, вместо использования XPath, я обычно использую методы обхода дерева. Здесь first_elt, чтобы найти свойство, затем field (что эквивалентно first_child()->text), чтобы получить значение ссылки.

#!/usr/bin/perl

use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig->new();

# parse the file
$twig->parsefile("so.xml");

# look for StringValue
my $property= $twig->first_elt( 'Property[@Name="MyClass.Code"]');
my $link= $property->field( 'LinkValue');
print $link;
...