我從第三方解析Xml時遇到問題;有幾個不同版本的XML,它們發送的是重疊的命名空間;XML :: LibXML - 查找(並註冊)文檔中使用的名稱空間
版本1個
富= 「甕:bar.org/version-1」
遠= 「甕:gle.org/version-1」
版本2
foo =「bar:a.org/version-2」
遠=「GLE:a.org/version-2」
以前(那時我纔不得不處理一個版本),我會從一個硬編碼的哈希註冊的命名空間,如下所示:
#!/usr/bin/perl
use strict;
use XML::LibXML ;
my $cfg->{namespace} = {
foo=>"urn:bar.org/version-1",
far=>"urn:gle.org/version-1",
};
my $parser = XML::LibXML->new({recover => '1'});
my $doc = $parser->parse_string($inputHash->{$key}->{xml});
my $xc = XML::LibXML::XPathContext->new($doc->documentElement());
for my $ns (keys %{$cfg->{namespace}})
{
$xc->registerNs($ns => $cfg->{namespace}->{$ns});
}
顯然,這將只對第1版工作..
有沖刷的libxml文檔,但不能找到一種方式來提取在文檔中使用的命名空間並註冊;任何人都可以給我一個指針嗎?
僞DOC:
<?xml version="1.0"?>
<foo:Parent xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:foo="bar:a.org/version-2">
<far:Child xmlns:gle="gle:a.org/version-2">
{horrific structure with more ns declarations all of which need registering}
</far:Child>
</foo:Parent>
如果命名空間不可預知,那麼這是一個瘋狂的模式!你不應該處理這個。 – ikegami
我知道,但不應該不是一種選擇。這是一家大型電信公司的工作 - 對他們感到羞恥! – beresfordt
是的,我只是同情。請注意,XPath'name(「moo」)'將匹配來自任何名稱空間的元素'moo'。在查找名稱空間要識別的元素時,它可能很有用。 – ikegami