【发布时间】:2019-06-03 13:14:31
【问题描述】:
我无法让 Perl 使用 XML::LibXML 读取 Google LocationHistory.kml 文件。 findnodes() 找不到 when 标签,但确实找到 gx:coord 标签。
如果我修改 XML 文件以将 gx: 放在 when 前面,它可以工作。但这不是谷歌通过他们的外卖服务生产的。
我想在不修改文件的情况下阅读他们的文件。
输入数据文件 - 来自 Google 的外卖服务
#++++++++++++++++++++++++++++++++++++++++
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2' xmlns:gx='http://www.google.com/kml/ext/2.2'>
<Document>
<Placemark>
<open>1</open>
<gx:Track>
<altitudeMode>clampToGround</altitudeMode>
<when>2018-05-17T15:59:24Z</when>
<gx:coord>-98.0896248 29.997944600000004 258</gx:coord>
<when>2018-05-17T15:59:24Z</when>
<gx:coord>-98.0896248 29.997944600000004 258</gx:coord>
<when>2018-05-17T15:59:23Z</when>
<gx:coord>-98.0896647 29.9979384 258</gx:coord>
<when>2018-05-17T15:45:14Z</when>
<gx:coord>-98.0896772 29.9979363 258</gx:coord>
<when>2018-05-17T15:40:08Z</when>
<gx:coord>-98.0892224 29.9977119 262</gx:coord>
</gx:Track>
</Placemark>
</Document>
</kml>
我的代码
#++++++++++++++++++++++++++++++++++++++++
sub Test {
my ($infile) = @_;
my ($dom, $xpc, @gnodes, @wnodes);
$dom = XML::LibXML->load_xml(location => $infile);
$xpc = XML::LibXML::XPathContext->new($dom);
$xpc->registerNs('xmlns', 'http://www.opengis.net/kml/2.2');
$xpc->registerNs('xmlns:gx', 'http://www.google.com/kml/ext/2.2');
# should find 5
(@wnodes) = $xpc->findnodes('//when');
print 'XPath: //when Matched: ', scalar(@wnodes), "\n";;
# should find 5
(@gnodes) = $xpc->findnodes('//gx:coord');
say 'XPath: //gx:coord Matched: ', scalar(@gnodes);
};
THE OUTPUT - five <gx:coord> found, but zero <when> nodes found
searching for <gx:when> also produces zero results
#++++++++++++++++++++++++++++++++++++++++
Apple-iMac21:NewProgramLocal user$
XPath: //when Matched: 0
XPath: //gx:coord Matched: 5
Apple-iMac21:NewProgramLocal user$
【问题讨论】:
-
当没有指定命名空间时,一个元素将在默认命名空间中。您是否尝试过寻找“xmlns:when”?
-
(@wnodes) = $xpc->findnodes('//xmlns:when'); -- 产生正确的结果。谢谢!!
标签: xml perl google-maps xpath kml