使用Perl通过Xpath从XML中提取数据

Aar*_*ier 1 perl xpath

情况: 我目前正在使用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>
Run Code Online (Sandbox Code Playgroud)

我试图访问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);
Run Code Online (Sandbox Code Playgroud)

提前感谢您通过此观看的时间..

Ric*_*ton 6

添加use warnings;use strict;你的脚本的顶部,它会告诉你有关你的查询问题.(线索 - @date_time看起来像一个变量名.)

接下来,您会注意到它tradenet不是测试文件中的顶级标记.

然后,修复了这些,你会发现setData()对于一个属性是不正确的,它是setValue().

然后它会工作.

如果您将脚本转换为小型测试并在发布问题之前自行运行,那么您自己就会发现这一切.