gpt4 book ai didi

XML::LibXML - 查找(并注册)文档中使用的 namespace

转载 作者:行者123 更新时间:2023-12-04 16:50:48 25 4
gpt4 key购买 nike

我在解析来自第三方的 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"


以前(当我只需要处理一个版本时)我会像这样从硬编码哈希中注册 namespace :

#!/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 文档,但找不到提取文档中使用的 namespace 并注册它们的方法;谁能给我指点一下吗?

伪文档:

<?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>

最佳答案

离开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 对此进行了测试,它对我有用。

关于XML::LibXML - 查找(并注册)文档中使用的 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7388555/

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