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>

Hours of StartPoint タグを変更するための 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

実際、私は長い間使用していたので、SetWindow.pm のようなすべての独自の *.pm にオブジェクトをXML::XPath送信する必要があります。同時に、独自の PM に送信する前に、標準 xml の属性の値を変更する必要があります。XML::XPath

前もって感謝します。

どんな助けでも大歓迎です!

rndpilot

4

1 に答える 1

2

XML::Xpath は XML を解析するので、ファイルまたは文字列として XML に送信する必要があります。

賢くなりたい場合、小枝から情報を抽出することだけが必要な場合は、XML::Twig の代わりに XML::Twig::XPath を使用できます (::Twig::XPath は XML の一部です:: twig ディストリビューション)、および twig オブジェクトとその要素は、XML::XPath に対してクエリを実行できる十分な DOM 風のメソッドを取得します。それだけの価値があるかどうかはわかりません。

私が考えることができる代替方法:

  • XML::XPath を使用して属性を直接変更しないのはなぜですか? getAttributeNodessetValueすべきことの組み合わせ、
  • XML::XPath を XML::LibXML に置き換えます。インターフェースは非常に似ており (DOM + XPath)、はるかに優れたモジュールです
  • XML::Twig::XPath を使用して、XML::Twig で完全な XPath サポートを取得します。
于 2011-10-19T08:08:54.313 に答える