【发布时间】:2017-10-28 00:08:05
【问题描述】:
我正在尝试按照以下方式从 XML 文件中提取值:
<?xml version="1.0" encoding = "UTF-8" ?>
<!-- SAP Data Services generated XML -->
<!-- 2017-05-26.22:12:03(409,091)[1] -->
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CreatedAt>2017-05-26T22:12:11</CreatedAt>
<CreateBy>BJOB_ODS_WF5MD_WEBSITE_FILES_5MIN_DATA</CreateBy>
<StartDate>2017-05-21T00:00:00</StartDate>
<DataSet Series = "5_Minute" ><Data><Value>10875.60</Value>
</Data>
....
<DataSet Series = "Actual" ><Data><Value>11150.00</Value>
</Data>
<Data><Value>10700.00</Value>
</Data>
<Data><Value>10450.00</Value>
</Data>
...
</Data>
</DataSet>
</Root>
希望以下输出到 csv,但不喜欢以下脚本:
11150.00
10700.00
10450.00
****SCRIPT
use warnings;
use strict;
use XML::Twig;
#<DataSet Series = "Actual" ><Data><Value>11112.60</Value
my $file = '/var/data/Actual.xml' ||die $!;
my $t=XML::Twig->new();
$t->parsefile( $file );
# my @sets = $t->findnodes('//DataSet[@seriesName= "Actual" ]/set');
# I CHANGED THE ABOVE AND MODIFIED AS SHOWN BELOW
my @sets = $t->findnodes('//DataSet[@Series= "Actual" ]/Value');
if (@sets) {
my $outfile = '/var/csv/actual.csv';
open my $out, ">", $outfile or die "Could not open $outfile: $!";
print { $out } $_->att('Value')."\n" for @sets;
}
任何帮助将不胜感激。
【问题讨论】:
-
您的 XML 中没有
set元素,但您的 xpath 表达式需要一个。我现在不能尝试,但你应该对//DataSet[@seriesName= "Actual" ]/Data/Value很好,然后不要使用$_->att,因为Value不是属性。使用上面的 xpath,您将拥有节点,并且可以访问 text 属性。我不记得如何了,请查看文档。