我刚刚开始使用Perl 1周前,我是一个编程newbee.请帮助,因为我的公司项目依赖于此.
情况:
我想打开一个XML文件,在这个例子中是Library.xml,并使用特定的"ISBN"编号编辑XML文档.找到ISBN号后,我想用匹配的"ISBN"号码更改特定书籍的页数.
问题:
现在,我可以做到以上但是,我需要保存更新的XML,使用相同的名称"library.xml",并保持原始XML文档的XML结构.这是我难倒的地方.我尝试过使用XML :: DUMPER和XML :: TWIG以及其他可能但都失败了.
原始XML文档:
library.XML看起来像这样:
<library>
<book>
<title>Perl Best Practices</title>
<author>Damian Conway</author>
<isbn>0596001738</isbn>
<pages>542</pages>
<image src="http://www.oreilly.com/catalog/covers/perlbp.s.gif"
width="145" height="190" />
</book>
<book>
<title>Perl Cookbook, Second Edition</title>
<author>Tom Christiansen</author>
<author>Nathan Torkington</author>
<isbn>0596003137</isbn>
<pages>964</pages>
<image src="http://www.oreilly.com/catalog/covers/perlckbk2.s.gif"
width="145" height="190" />
</book>
<book>
<title>Guitar for Dummies</title>
<author>Mark Phillips</author>
<author>John Chappell</author>
<isbn>076455106X</isbn>
<pages>392</pages>
<image src="http://media.wiley.com/product_data/coverImage/6X/07645510/076455106X.jpg"
width="100" height="125" />
</book>
</library>
Run Code Online (Sandbox Code Playgroud)
代码:
以下是我试图操作但没有成功的代码.
#!/usr/bin/perl
use strict;
use warnings;
#use XML::Simple qw(:strict);
use XML::LibXML;
use XML::Dumper;
my $dump = new XML::Dumper; …Run Code Online (Sandbox Code Playgroud) 情况: 我目前正在使用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)
提前感谢您通过此观看的时间..
我在Window 7机器上使用Perl进行编码.我可以使用下面的XPath代码从XML中提取数据
use strict;
use warning;
use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($newfile);
my $query = "/tradenet/message/header/unique_ref_no/date/text( )";
my($node) = $doc->findnodes($query);
$node->setData("$file_seq_number");
Run Code Online (Sandbox Code Playgroud)
但是,当我在不同的XML上使用相同的代码时,第二个文档中的xpath如下所示:
/TradenetResponse/OutboundMessage/out:OutwardPermit/out:Declaration/out:Header/cac:UniqueReferenceNumber/cbc:SequenceNumeric
Run Code Online (Sandbox Code Playgroud)
与Perl代码一起,这就是提取代码的样子:
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($newfile);
my $query = "/TradenetResponse/OutboundMessage/out:OutwardPermit/out:Declaration/out:Header/cac:UniqueReferenceNumber/cbc:SequenceNumeric/text( )";
my($node) = $doc->findnodes($query);
$node->setData("$file_seq_number");
Run Code Online (Sandbox Code Playgroud)
使用第二个代码,我无法从第二个XML检索数据.我在Perl.pl第5行的未定义值上收到此错误"无法调用方法"setData".
第二个XPATH地址中的":"字符是否会影响代码?