1

状況: 現在、XML::LibXML を使用して XML からデータを抽出しています。これを XML 要素の Xpath と組み合わせると、XML のほとんどの値を読み取って置き換えることができます。ただし、XML の最初のタグにある特定のデータにアクセスできないようです。これはかなり重要なフィールドですが、いくつかの方法を試しましたが、まだそのフィールドを操作できません。

XML ファイル:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <test **date_time="201111031006"** xsi:noNamespaceSchemaLocation="test.xsd">
    <msg_ver>0001</msg_ver>
    <sender_id>john</sender_id>
    <recipient_id>mike</recipient_id>
 </test>

date_time フィールド (太字) にアクセスしようとしていますが、アクセスできないようです。XPathをコピーして試してみましたが、うまくいきません。実際にフィールドなどを変更することはできますが、date_time フィールドを変更することはできません。フィールドを変更するどころか、フィールドからデータを抽出することさえできません。同じ関数を使用して、フィールド 、および への変更を読み取り、抽出して保存できます。

マイコード

 sub CHANGE_DATE()
  {
    my $parser = XML::LibXML->new();
    my $doc    = $parser->parse_file($newfile);
    my $query  = "/tradenet/@date_time"; ## this is the actual XPATH
    my($node)   = $doc->findnodes($query);
        $node->setData("$date");

    $doc->toFile($newfile);

ご覧いただきありがとうございます。

4

2 に答える 2

6

use warnings;スクリプトの先頭にanduse strict;を追加すると、クエリの問題について通知されます。(手がかり -@date_time変数名のように見えます。)

tradenet次に、これがテスト ファイルの最上位のタグではないことに気付くでしょう。

setData()次に、これらを修正すると、属性として正しくないことがわかりますsetValue()

それはうまくいくでしょう。

スクリプトを小さなテストに変換し、質問を投稿する前に自分で実行していれば、これらすべてを発見できたはずです。

于 2012-04-27T04:40:39.697 に答える
0

次の xPath クエリ /test/@date_time を試してください。これでうまくいくはずです。

my $query  = '/test/@date_time'; 

また、W3School には xPath に関する優れたチュートリアルがあり、libXML は同じ内容に従います。

http://www.w3schools.com/xpath/

これが役立つことを願っています。

于 2012-04-27T05:02:41.393 に答える