Есть ли какой-нибудь возможный способ конвертировать объект XML :: Twig в объект XML :: XPath? - PullRequest
1 голос
/ 19 октября 2011

Я давно использую XML::XPath для разбора xml, теперь ситуация изменила значение атрибута.

xml доступен в файле, он будет очень похож на этот.

<AppName>
    <Action AllDay='1'StartRace='1'/>
    <StartPoint AM_PM='AM' Hours='09' Mins='30'/>
    <EndPoint AM_PM='PM' Hours='06' Mins='30'/>
</AppName>

Я написал Perl-скрипт для изменения тега Hours of StartPoint,

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

my $fileName = 'Conf.xml';

my $twig = XML::Twig->new(
    twig_roots => { StartPoint => \&ReplaceAtriValue },
    twig_print_outside_roots => 1, );

sub ReplaceAtriValue {

    my ($twig, $startPoint) = @_;
    if ( '09' eq $startPoint->att('Hours') )

    {
        $startPoint->set_att( Hours => '12');
    }
    $startPoint->print(); }

$twig->parsefile($fileName);

У меня есть некоторые, как успешно заменил 09 на 12, теперь $twig имеет объект xml.Если я отправляю этот объект ($twig) в мой SetWindow.pm, который анализирует xml, используя XML::XPath, не распознал этот объект.Есть ли какой-нибудь возможный способ преобразовать XML::Twig объект в XML::XPath объект, чтобы XML::XPath проанализировал значения в $twig объекте.

На самом деле я использовал XML::XPath для долгого возврата, следовательно, у меня естьчтобы отправить XML::XPath объект всем моим * .pm, таким как SetWindow.pm, в то же время мне нужно изменить значения атрибута стандартного xml перед отправкой моим собственным PM.

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

Любая помощь очень ценится!

rndpilot

1 Ответ

2 голосов
/ 19 октября 2011

XML :: Xpath анализирует XML, поэтому вы должны отправлять его в файл или в виде строки.

Теперь, если вы хотите быть умным, и все, что вам нужно, это извлечь информацию из ветки, вы можете использовать XML :: Twig :: XPath вместо XML :: Twig (:: Twig :: XPathчасть ветки XML :: twig), и объект twig и его элементы получат достаточно методов DOM-ish, чтобы XML :: XPath мог выполнять запросы к ним.Я не уверен, что это того стоит.

Альтернативные методы, которые я могу придумать:

  • Почему бы вам не изменить атрибуты напрямую, используя XML :: XPath?комбинация getAttributeNodes и setValue должна сделать это,
  • заменить XML :: XPath на XML :: LibXML.интерфейс очень похож (DOM + XPath) и гораздо лучше модуль
  • использовать XML :: Twig :: XPath для получения полной поддержки XPath в XML :: Twig
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...