2012-04-27 66 views
1

现状: 我目前使用XML :: LibXML从XML中提取数据。我将它与XML元素的Xpath结合起来,我可以读取和替换XML中的大部分值。但是,我似乎无法访问XML的第一个标签中的特定数据。这是一个相当重要的领域,但我尝试了一些方法,仍然无法操纵该领域。使用Perl通过Xpath从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); 

感谢您提前考虑一下通过这个时候..

回答

6

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

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

然后,修复这些后,您会发现setData()对于某个属性而言是不正确的,它是setValue()

然后它会工作。

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

+0

谢谢你的提示。我对错别字表示歉意,因为我必须在分类时编辑原始XML文档。因此,XPATH名称的错误。再次感谢。 – 2012-04-27 07:33:53

0

请尝试以下xPath query/test/@ date_time这应该工作。

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

此外,W3School为xPath和libXML遵循相同的优秀教程。

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

希望这会有所帮助。

+0

由于您试图插入@date_time作为变量,因此您会收到警告。看到我上面的答案。 – 2012-04-27 05:45:06

+0

更新我的答案。 – rpg 2012-04-27 06:27:58