如何使用Perl XML :: LibXML表示默认的null命名空间

时间:2011-03-01 13:25:46

标签: xml perl namespaces libxml2

这是我生成给定XML的代码。

my $doc = XML::LibXML::Document->new( '1.0', 'utf-8' );
my $nodeBroadsoft = $doc->createElementNS ('C', 'BroadsoftDocument');
$nodeBroadsoft->setNamespace ('http://www.w3.org/2001/XMLSchema-instance', 'xsi', 0);
$nodeBroadsoft->setAttributeNS('', 'protocol', 'OCI' );
$doc->addChild ($nodeBroadsoft);

my $nodeSession = $doc->createElementNS ('', "sessionId");
$nodeSession->setNamespace ("", undef, 0);
$nodeSession->appendTextNode ($sessionID);
$nodeBroadsoft->addChild ($nodeSession);

my $nodeCommand = $doc->createElementNS ('', "command");
$nodeCommand->setNamespace ("", undef, 0);
$nodeBroadsoft->addChild ($nodeCommand);
$nodeCommand->setAttributeNS ('http://www.w3.org/2001/XMLSchema-instance', 'type', 'AuthenticationRequest');

my $nodeUserId = $doc->createElementNS ('', 'userId');
$nodeUserId->appendTextNode ('automation');
$nodeCommand->addChild ($nodeUserId);

当我运行此程序时,它正在生成以下XML

<?xml version="1.0" encoding="utf-8"?>
<BroadsoftDocument xmlns="C" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" protocol="OCI">
<sessionId>1231313313133131</sessionId>
<command xsi:type="AuthenticationRequest">
<userId>automation</userId>
</command>
</BroadsoftDocument>

我需要以下内容:

<BroadsoftDocument protocol="OCI" xmlns="C" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <sessionId xmlns="">31436753,1298637565495</sessionId>
    <command xsi:type="AuthenticationRequest" xmlns="">
    <userId>automation</userId>
    </command>
</BroadsoftDocument>

唯一的区别在于sessionId和command元素。生成的XML缺少这两个标签的“xmlns =”“”。

我正在尝试使用以下功能,但它无效。

$nodeSession->setNamespace ("", undef, 0);
$nodeCommand->setNamespace ("", undef, 0);

据我所知(作为XML的初学者),我需要具有sessionId和命令元素的null值的默认命名空间。请帮忙

1 个答案:

答案 0 :(得分:0)

这里的聚会很晚,我正在学习XML名称空间作为一项与工作相关的非工作性题外话题 - 对我来说是一个很好的练习。

如果可以使用空格而不是空字符串来表示空命名空间,则可以使用:

my $sessionID=1231313313133131;
my $nodeSession = $doc->createElementNS (" ", "sessionId");
# No need to call setNamespace
$nodeSession->appendTextNode ($sessionID);

结果:

<sessionId xmlns=" ">1231313313133131</sessionId>

我也尝试过使用Perl hackery,使用一个在bolean&amp;数字上下文字符串化为空字符串。它没有达到预期的效果。对于咯咯笑声,您可以在PerlMonks查看该尝试。