有没有可能的方法将XML :: Twig对象转换为XML :: XPath对象?

时间:2011-10-19 06:29:36

标签: 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脚本来更改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)发送到使用XML::XPath解析xml的SetWindow.pm,则无法识别此对象。有没有办法将XML::Twig对象转换为XML::XPath对象,以便XML::XPath解析$twig对象中的值。

实际上我长时间使用XML::XPath因此我必须将XML::XPath对象发送到我自己的* .pm,如SetWindow.pm,同时我需要更改值在发送给我自己的PM之前标准xml的属性。

先谢谢。

非常感谢任何帮助!

rndpilot

1 个答案:

答案 0 :(得分:2)

XML :: Xpath解析XML,因此您应该以文件或字符串形式发送给它。

现在,如果你想要聪明,并且你想要的只是从树枝中提取信息,你可以使用XML :: Twig :: XPath而不是XML :: Twig(:: Twig :: XPath是XML :: twig发布,以及twig对象及其元素将获得足够的DOM-ish方法,使XML :: XPath能够对它们运行查询。我不确定它是否值得。

我能想到的替代方法:

  • 为什么不直接使用XML :: XPath更改属性? getAttributeNodessetValue的组合应该这样做,
  • 用XML :: LibXML替换XML :: XPath。界面非常相似(DOM + XPath),它是一个更好的模块
  • 使用XML :: Twig :: XPath在XML :: Twig中获得完整的XPath支持