Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将带有空格的xml文件中的值插入csv文件_Xml_Perl_Csv_Parsing - Fatal编程技术网

将带有空格的xml文件中的值插入csv文件

将带有空格的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

我试图用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: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;