首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML::LibXML -查找(并注册)文档中使用的命名空间

XML::LibXML -查找(并注册)文档中使用的命名空间
EN

Stack Overflow用户
提问于 2011-09-12 13:21:47
回答 3查看 2.7K关注 0票数 2

我在从第三方解析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“

以前(当我只需要处理一个版本时),我会从一个硬编码哈希注册名称空间,如下所示:

代码语言:javascript
复制
#!/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文档,但无法找到提取文档中使用的命名空间并注册它们的方法;请有人给我一个指针。

伪医生:

代码语言:javascript
复制
<?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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-12 14:55:32

离开this answer,我将使用//namespace::* XPath表达式来查找名称空间。尝试这个代码示例,看看它是否有帮助:

代码语言:javascript
复制
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测试了它,它对我起了作用。

票数 9
EN

Stack Overflow用户

发布于 2011-09-12 14:16:34

我会尝试XML::LibXML::Node::lookupNamespaceURI,即

代码语言:javascript
复制
$cfg->{namespace}->{foo} = $node->lookupNamespaceURI("foo");

对于某个节点,其深度足以使其具有声明。使用最简单的节点将是文档,但除非在顶部声明名称空间,否则这是行不通的;最普遍的方法是遍历所有节点,并根据应用程序逻辑处理相同前缀被重用到不同名称空间的情况.

票数 0
EN

Stack Overflow用户

发布于 2011-09-12 14:20:28

在树上迭代查找名称空间,直到找到名称空间,例如使用getElementsByTagName或类似的名称空间。

代码语言:javascript
复制
#!/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 =>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7388555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档