gpt4 book ai didi

xml - 将带有 namespace 的 xml 文件中的值插入到 csv 文件中

转载 作者:数据小太阳 更新时间:2023-10-29 02:50:54 26 4
gpt4 key购买 nike

我正在尝试保存带有 ID 的 HTTP,就像这个一样

https://hostname:9060/ers/config/networkdevice/1

在“output.csv”中。之后,我想在我的获取请求中使用这些链接,以从管理系统获取有关设备的更多信息。

<?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>

但是在使用我的 Perl 脚本之后,我的文件是空的。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use XML::Simple;

#NOTE: Update this to contain my elements in CSV
my @Fields = qw{id};

my $xml = XMLin('Get_All_Prime.xml', ForceArray => ['link']);

foreach my $link ( @{ $xml->{link} } ) {
print Dumper $link;

foreach my $link ( @{ $xml->{link} } ) {
print join( ',', @{ $link->{href} }{@Fields} ) . "\n";
}
}

open(my $out, '>', 'output.csv') or die "Output: $!\n";
foreach my $link ( @{ $xml->{link} } ) {
print $out join ( ',', @{$link->{href} }{@Fields} ) . "\n";
}

我不确定,我使用了正确的标签

 ForceArray => ['link']

但是在这种情况下我应该使用什么?

最佳答案

XML 的标准优秀库是 XML::LibXMLXML::Twig .

do not use XML::Simple .很久以前它自己的documentation said那个

The use of this module in new code is discouraged.

很久以前它自己的作者写了一个detailed tutorial for XML::LibXML .听从建议。

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;

这会找到 <link ...>元素优先,例如;或者你可以直接去 '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 .参见 this postthis post从哪里开始阅读其广泛而结构化的文档。


我会冒险并假设所需的 CSV 输出文件包含行 link_url,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,请使用 Text::CSVText::CSV_XS 的“薄包装” .

关于xml - 将带有 namespace 的 xml 文件中的值插入到 csv 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48267816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com