1

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 => \&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 的 SetWindow.pm XML::XPath,则无法识别此对象。是否有任何可能的方法将XML::Twig对象转换为XML::XPath对象,以便XML::XPath解析$twig对象中的值。

实际上我已经使用XML::XPath很久了,因此我必须XML::XPath像 SetWindow.pm 一样将对象发送到我自己的所有 *.pm,同时我需要在发送到我自己的 PM 之前更改标准 xml 的属性值。

提前致谢。

任何帮助深表感谢!

rndpilot

4

1 回答 1

2

XML::Xpath 解析 XML,所以这就是您应该发送给它的内容,无论是在文件中还是作为字符串。

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

我能想到的替代方法:

  • 为什么不直接使用 XML::XPath 更改属性?结合getAttributeNodes并且setValue应该这样做,
  • 用 XML::LibXML 替换 XML::XPath。界面非常相似(DOM + XPath),它是一个更好的模块
  • 使用 XML::Twig::XPath 在 XML::Twig 中获得完整的 XPath 支持
于 2011-10-19T08:08:54.313 回答