情况: 我目前正在使用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);
提前感谢你花时间看这个......
答案 0 :(得分:6)
将use warnings;
and use strict;
添加到脚本的顶部,它会告诉您查询的问题。 (线索 - @date_time
看起来像一个变量名。)
接下来,您会注意到tradenet
不是测试文件中的顶级标记。
然后,修复了这些问题后,您会发现某个属性的setData()
不正确,它是setValue()
。
然后它会起作用。
如果您将脚本转换为小型测试并在发布问题之前自行运行,那么您自己就会发现这一切。
答案 1 :(得分:0)
请尝试以下xPath查询/测试/ @ date_time这应该有效。
my $query = '/test/@date_time';
另外,W3School有很好的xPath教程,libXML也是如此。
http://www.w3schools.com/xpath/
希望这会有所帮助。