将带有空格的xml文件中的值插入csv文件
我试图用ID保存HTTPs,就像这个将带有空格的xml文件中的值插入csv文件,xml,perl,csv,parsing,Xml,Perl,Csv,Parsing,我试图用ID保存HTTPs,就像这个 https://hostname:9060/ers/config/networkdevice/1 在“output.csv”中。之后,我想在get请求中使用这些链接,从管理系统获取有关设备的更多信息 <?xml version="1.0" encoding="utf-8" standalone="yes"?> <ns3:searchResult total="3" xmlns:ns5="ers.ise.cisco.com" xmlns:e
https://hostname:9060/ers/config/networkdevice/1
在“output.csv”中。之后,我想在get请求中使用这些链接,从管理系统获取有关设备的更多信息
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns3:searchResult total="3" xmlns:ns5="ers.ise.cisco.com" xmlns:ers-v2="ers-v2"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns3="v2.ers.ise.cisco.com">
<ns3:resources>
<ns5:resource id="1"
name="Device1">
<link rel="self" href="https://hostname:9060/ers/config/networkdevice/1"
type="application/xml"/>
</ns5:resource>
<ns5:resource id="2"
name="Device2">
<link rel="self" href="https://hostname:9060/ers/config/networkdevice/2"
type="application/xml"/>
</ns5:resource>
<ns5:resource id="3"
name="Device3">
<link rel="self" href="https://hostname:9060/ers/config/networkdevice/3"
type="application/xml"/>
</ns5:resources>
</ns3:resources>
</ns3:searchResult>
我不确定我是否使用了正确的标签
ForceArray => ['link']
但是在这种情况下我应该使用什么呢?标准的、优秀的XML库是和 求你了。很久以前,它自己就是这样 不鼓励在新代码中使用此模块 很久以前,它的作者写了一篇文章。听从劝告
XML::LibXML
use warnings;
use strict;
use feature 'say';
use XML::LibXML;
my $file = shift @ARGV || 'Get_All_Prime.xml'
my $reader = XML::LibXML->new();
my $doc = $reader->load_xml(location => $file, no_blanks => 1);
my $xpath = '//ns3:searchResult/ns3:resources/ns5:resource/link';
my @links;
foreach my $node ($doc->findnodes($xpath)) {
push @links, $node->findvalue('./@href');
}
say for @links;
例如,首先查找
元素;或者您可以直接转到'href'
my $xpath = '//ns3:searchResult/ns3:resources/ns5:resource/link/@href';
foreach my $href ($doc->findnodes($xpath) {
push @links, $href->to_literal;
}
XML::LibXML
是一个完整的库,完全支持使用XML
。请参阅和,以了解从何处开始使用其广泛而结构化的文档
我将冒险假设所需的CSV输出文件具有行
link\uURL,id
my $outfile = 'output.csv';
open my $fh_out, '>', $outfile or die "Can't open $outfile: $!";
say $fh_out 'url,id'; # header
my $xpath = '//ns3:searchResult/ns3:resources/ns5:resource/link';
my @links;
foreach my $node ($doc->findnodes($xpath)) {
#say $node->findvalue('./@href'), ' => ', $node->findvalue('../@id');
push @links, [ map { $node->findvalue($_) } qw(./@href ../@id) ];
}
say $fh_out join ',', @$_ for @links;
为了更广泛地使用CSV,XML::Simple的默认解析器XML::Parser的“瘦包装器”不支持名称空间。避免使用解析器XML::Simple。我建议您使用XML::LibXML。您想要的输出可能有重复吗?@StayCalm我不知道您需要从链接中提取什么,以及如何将其转换为CSV,但我希望上述内容足够好。如果您确实需要更多详细信息,或者CSV上的信息,请告诉我(请用这些信息编辑问题)。@StayCalm添加了我猜所需的输出。请用清晰的语句编辑问题。我在shell中看到结果,但我的输出文件只包含标题,没有https链接。我还有一个警告:不能使用字符串(“)作为数组引用,而在@links的
say$fh_out join',',@$处使用的“strict refs;”
@StayCalm最后一个代码段是从测试脚本中复制出来的。@$
解除了[…]的保护
对于每个@链接
,生成与,
连接的列表。它不应该抛出该警告,并且应该可以工作?(注意,如果使用第一个(完整)脚本,则不能使用最后一个代码段的最后一行写入文件,此时它将抛出该警告。)@StayCalm我看到了对问题的编辑,谢谢。澄清一下:它说你想要url…只是,没有id作为单独的CSV字段吗?(如果是这样,你不需要这个答案中的最后一个代码片段。)
my $outfile = 'output.csv';
open my $fh_out, '>', $outfile or die "Can't open $outfile: $!";
say $fh_out 'url,id'; # header
my $xpath = '//ns3:searchResult/ns3:resources/ns5:resource/link';
my @links;
foreach my $node ($doc->findnodes($xpath)) {
#say $node->findvalue('./@href'), ' => ', $node->findvalue('../@id');
push @links, [ map { $node->findvalue($_) } qw(./@href ../@id) ];
}
say $fh_out join ',', @$_ for @links;