Почему модуль XML :: simple в Perl не выводит ожидаемый формат? - PullRequest
1 голос
/ 22 марта 2012

В настоящее время я пытаюсь написать функцию Perl, которая может записывать XML в файл. Рекомендуемый модуль: XML::Simple. Я написал код ниже и вижу вывод XML, но не вижу того, что пытаюсь вывести. Я приложил свой код, результат и ожидаемый результат. Что я делаю не так?

#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;

sub writexmlout {
  my $hashref = {
        'Contracts' => {
           'ShortName' => '123231123'
         },
         'CallStates' => {
            'CallStatesSPR' => {
           'Name' => 'Acknowledged'
             }
         },
         'ContractElements' => {
             'ShortName' => 'test'
         },
         'Calls' => {
             'CHD' => {
                 'FirstName' => 'Ron',
                 'LastName' => 'Rich',
                 'Tel' => '(123)  456-4567',
                 'Sign' => 'B2B',
                 'Email' => 'ron.rich@mavenir.com'
             },
             'SPCallID' => '12',
             'Remarks' => 'Ticket successfully Ebonded',
             'CustCallID' => '6199999'
         }
  };

  # Create object
  my $xml = new XML::Simple( NoAttr => 1,
                             SuppressEmpty => 1,
                             XMLDecl => 1 ,
                             RootName=>'CallData');

  my $result = $xml->XMLout($hashref);
  print $result;
}

writexmlout();

Неожиданные результаты

<?xml version='1.0' standalone='yes'?>
<CallData>
  <CallStates>
    <name>CallStatesSPR</name>
    <Name>Acknowledged</Name>
  </CallStates>
  <Calls>
    <CHD>
      <Email>ron.rich@mavenir.com</Email>
      <FirstName>Ron</FirstName>
      <LastName>Rich</LastName>
      <Sign>B2B</Sign>
      <Tel>(123)  456-4567</Tel>
    </CHD>
    <CustCallID>6199999</CustCallID>
    <Remarks>Ticket successfully Ebonded</Remarks>
    <SPCallID>12</SPCallID>
  </Calls>
  <ContractElements>
    <ShortName>test</ShortName>
  </ContractElements>
  <Contracts>
    <ShortName>123231123</ShortName>
  </Contracts>
</CallData>

Желаемые результаты

<?xml version='1.0' standalone='yes'?>
<CallData>
 <CallStates>
    <CallStatesSPR>
     <Name>Acknowledged</Name>
    </CallStatesSPR>
  </CallStates>
  <Calls>
    <CHD>
      <Email>ron.rich@mavenir.com</Email>
      <FirstName>Ron</FirstName>
      <LastName>Rich</LastName>
      <Sign>B2B</Sign>
      <Tel>(123)  456-4567</Tel>
    </CHD>
    <CustCallID>6199999</CustCallID>
    <Remarks>Ticket successfully Ebonded</Remarks>
    <SPCallID>12</SPCallID>
  </Calls>
  <ContractElements>
    <ShortName>test</ShortName>
  </ContractElements>
  <Contracts>
    <ShortName>123231123</ShortName>
  </Contracts>
</CallData>

Почему это происходит? Почему появился тег «имя», которого я не ожидал?

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Правильный способ сделать это - полностью отключить сворачивание атрибутов.Предыдущие ответы работают только потому, что они ограничивают сворачивание массива атрибутами, которые нигде не существуют в вашем источнике.Поскольку у вашего XML вообще нет атрибутов, вы должны установить KeyAttr в пустой список с

KeyAttr => {},

, который правильно выдает результат

<CallStates>
  <CallStatesSPR>
    <Name>Acknowledged</Name>
  </CallStatesSPR>
</CallStates>

Могу ли я добавить, что я верю XML::Simple может быть плохим выбором, и вряд ли это будет последней из ваших проблем.Рассмотрим XML::DOM или XML::LibXML, если вы начинаете терять терпение.

0 голосов
/ 22 марта 2012

Опция KeyAttr => позволит вам указать имена элементов, которые вы хотите использовать в качестве первичных ключей.В вашем случае, например, вы хотите KeyAttr => { CallStatesSPR => 'name'}

0 голосов
/ 22 марта 2012

Вам необходимо использовать опцию KeyAttr:

 my $result = $xml->XMLout($hashref,KeyAttr=>{item=>"CallStatesSPR"});

Я не очень разбираюсь в XML::Simple, но из того, что я могу собрать, эта опция говорит парсеру, что вы хотите рассматривать CallStatesSPR как элемент и поместить полученную ссылку на хеш внутри <CallStatesSPR> теги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...