我在从第三方解析Xml时遇到了问题;它们发送的xml有几个不同版本,名称空间重叠;
版本1
foo="urn:bar.org/version-1“
far="urn:gle.org/version-1“
第2版
foo="bar:a.org/version-2“
far="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文档,但无法找到提取文档中使用的命名空间并注册它们的方法;请有人给我一个指针。
伪医生:
<?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>发布于 2011-09-12 14:55:32
离开this answer,我将使用//namespace::* XPath表达式来查找名称空间。尝试这个代码示例,看看它是否有帮助:
use strict;
use warnings;
use XML::LibXML;
my $cfg;
my $xml = XML::LibXML->load_xml( location => <your xml>);
foreach my $node ($xml->findnodes('//namespace::*')) {
$cfg->{namespace}{$node->getLocalName()} = $node->getValue();
}这将用所需的内容填充您的散列。而且,这个XPath表达式并不总是受支持的。我使用LibXML 1.70和dll版本20703测试了它,它对我起了作用。
发布于 2011-09-12 14:16:34
我会尝试XML::LibXML::Node::lookupNamespaceURI,即
$cfg->{namespace}->{foo} = $node->lookupNamespaceURI("foo");对于某个节点,其深度足以使其具有声明。使用最简单的节点将是文档,但除非在顶部声明名称空间,否则这是行不通的;最普遍的方法是遍历所有节点,并根据应用程序逻辑处理相同前缀被重用到不同名称空间的情况.
发布于 2011-09-12 14:20:28
在树上迭代查找名称空间,直到找到名称空间,例如使用getElementsByTagName或类似的名称空间。
#!/usr/bin/perl --
use strict;
use warnings;
use XML::Twig;
my $xml = <<'__XML__';
<?xml version="1.0"?>
<!-- initially, the default namespace is "books" -->
<book xmlns='urn:loc.gov:books'
xmlns:isbn='urn:ISBN:0-395-36341-6'>
<title>Cheaper by the Dozen</title>
<isbn:number>1568491379</isbn:number>
<notes>
<!-- make HTML the default namespace for some commentary -->
<p xmlns='urn:w3-org-ns:HTML'>
This is a <i>funny</i> book!
</p>
</notes>
</book>
__XML__
{
my $t = XML::Twig->new(
start_tag_handlers => {
_all_ => sub {
my $tag = $_[1]->tag;
my $nsp = $_[1]->ns_prefix||'';
print "$tag => $nsp\n";
print map {
join ' ',
"\t", $_,' => ', $_[1]->att($_), "\n"
} grep /xmlns/ , $_[1]->att_names ;
},
},
);
$t->parse($xml);
}
__END__
book =>
xmlns => urn:loc.gov:books
xmlns:isbn => urn:ISBN:0-395-36341-6
title =>
isbn:number => isbn
notes =>
p =>
xmlns => urn:w3-org-ns:HTML
i =>https://stackoverflow.com/questions/7388555
复制相似问题