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;将和use 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 回答