Есть ли какой-либо возможный способ преобразовать объект XML :: Twig в объект XML :: XPath?

#xml #perl #xpath #twig

#xml #perl #xpath #twig

Вопрос:

Я 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 для изменения часов тега начальной точки,

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

my $fileName = 'Conf.xml';

my $twig = XML::Twig->new(
    twig_roots => { StartPoint => amp;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 for long назад, поэтому я должен отправить XML::XPath объект всем своим * .pm, например SetWindow.pm , в то же время мне нужно изменить значения атрибута стандартного xml перед отправкой в мой собственный PMs.

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

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

rndpilot

Ответ №1:

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

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

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

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