gpt4 book ai didi

perl - 如何将 XML 元素 A 添加到没有 A 作为子元素的元素 B

转载 作者:行者123 更新时间:2023-12-05 01:08:06 25 4
gpt4 key购买 nike

我正在处理 gpx类似xml的文件。这是该文件的摘录:

<trkpt lat="3.1398377" lon="101.6937661">
<ele>0.0</ele>
<time>2013-01-01T00:00:00.000Z</time>
<name>Position 1</name>
</trkpt>

<trkpt lat="3.1250538" lon="101.6783237">
<ele>0.0</ele>
<name>Position 460</name>
</trkpt>

如您所见,一些 <trkpt>元素包含 <time>元素,有些则没有。如何添加 <time>给那些<trkpt>不包含它的元素?

在读取文件时,如果 XML 节点不包含 <time>,则会产生错误:

foreach $points ( $root->getElementsByTagName('trkpt') ) {
my($lat) = $points->findvalue('@lat');
my($lon) = $pints->findvalue('@lon');
my($time) = $points->getElementsByTagName('time')->[0]->textContent();
my($pointName) = $points->getElementsByTagName('name')->[0]->textContent();
}

Can't call method "textContent" on an undefined value at ...

如何让它更智能?即如果遇到undefined $time , 它将写入 <time>写入gpx文件,没有报错。

最佳答案

根据文件的大小,您可能希望使用 XML::LibXML ,它将整个 XML 文档读入内存,或 XML::Twig ,这将允许您将 XML 作为流进行处理并最大限度地减少所用内存。

用于测试目的我添加了一个根元素 <root>到您的输入数据,使其成为格式良好的 XML,就像这样

<root>
<trkpt lat="3.1398377" lon="101.6937661">
<ele>0.0</ele>
<time>2013-01-01T00:00:00.000Z</time>
<name>Position 1</name>
</trkpt>
<trkpt lat="3.1250538" lon="101.6783237">
<ele>0.0</ele>
<name>Position 460</name>
</trkpt>
</root>

这是一个使用 XML::LibXML 的解决方案

use strict;
use warnings;

use XML::LibXML;

my $doc = XML::LibXML->load_xml(location => 'trkpt.xml');

for my $trkpt ($doc->findnodes('/*/trkpt')) {
unless ($trkpt->exists('time')) {
my ($ele) = $trkpt->findnodes('ele');
my $time = $doc->createElement('time');
$time->appendTextNode('0.0');
$trkpt->insertAfter($time, $ele);
}
}

print $doc->toString(1);

这是一个等效的用法 XML::Twig

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new(
twig_roots => { trkpt => \&trkpt },
twig_print_outside_roots => 1,
pretty_print => 'indented'
);
$twig->parsefile('trkpt.xml');

sub trkpt {
my ($twig, $trkpt) = @_;
unless ($trkpt->has_child('time')) {
my $time = XML::Twig::Elt->new(time => '0.0');
my $ele = $trkpt->first_child('ele');
$time->paste('after', $ele);
}
$twig->flush;
}

关于perl - 如何将 XML 元素 A 添加到没有 A 作为子元素的元素 B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17120233/

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