как представить пустое пространство имен по умолчанию, используя Perl XML :: LibXML - PullRequest
1 голос
/ 01 марта 2011

Вот мой код для генерации данного 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 и элементов команды. Пожалуйста, помогите

1 Ответ

0 голосов
/ 22 января 2015

Очень поздно здесь, на вечеринке, я узнаю о пространствах имен XML, поскольку неоплаченное отклонение от работы - было для меня хорошим упражнением.

Если все в порядке с пробелом вместо пустой строки для представления пустого пространства имен, это работает:

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

Результат:

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

Я также попытался прибегнуть к хакерской атаке на Perl, используя объект, который является истинным в логическом и числовом контекстах, но при этом переводится в пустую строку. Это не имело желаемого эффекта. Для хихиканья вы можете просмотреть эту попытку на PerlMonks .

...