Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Pregunta sobre XML y Perl

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mar Nov 14, 2006 10:47 am
caribesoft
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
Pregunta sobre XML y Perl Responder citando

Hola Amigos Perlianos :

Estoy batallando un poquito al tratar de recibir datos en XML dentro de un script en Perl y estoy un poco confundido.

Estoy utilizando XML::Simple, con la instrucción XLMin();

Mi Script es el siguiente :

Perl:
use strict;
print "Content-type:text/html\n\n";
use XML::Simple;

$xml = new XML::Simple ();
$reservas = $xml->XMLin();

      $action    = $reservas->{action};
      $propid    = $reservas->{PropertyID};
      $propname  = $reservas->{PropertyName};
      $chaincode = $reservas->{ChainCode};

# ... y asi sucesivamente armo la estructura de datos para Perl.


Esta es la estructura de datos que me envian :

XML:
<?xml version='1.0'?>
<gkxml>
 <export_version>0.7</export_version>
 <export_type>travelly</export_type>
 <export_date>20061113</export_date>
 <action>newres</action>
 <GroupID id='travelly'>
  <GroupName>Omega</GroupName>
  <ChainCode id='Delta'>
   <ChainName>Delta Hotels</ChainName>
   <PropertyID id='KJG6689'>
    <PropertyName>Omega Spa Resort</PropertyName>
    <PropertyExtID></PropertyExtID>
    <AgentID id='1'>
     <AgentCode>DIRECT</AgentCode>
     <AgentIATA>DIREC</AgentIATA>
     <AgentCTA>Direct Client</AgentCTA>
     <AffiliateAgentCode>delta</AffiliateAgentCode>
     <GuestReservationDetails>
      <GuestID id='2507'>
       <PNR>2507</PNR>
       <Title>Mr.</Title>
       <FirstName>Trent</FirstName>
       <LastName>Zagorsky</LastName>
       <Address>8385 Frederick Court </Address>
       <City>De Soto</City>
       <ProvState>ks</ProvState>
       <Country>United States</Country>
       <PostcodeZip>66018</PostcodeZip>
       <Telephone>9139098299</Telephone>
       <Fax></Fax>
       <Email>tzagorsky@kc.rr.com</Email>
       <CompanyName></CompanyName>
       <Nationality></Nationality>
       <PassportNumber></PassportNumber>
       <MembershipNumber></MembershipNumber>
       <Membership></Membership>
       <MailingList>yes</MailingList>
       <Language>en</Language>
       <ReservationID id='3373'>
        <ReservationNumber>GK3373</ReservationNumber>
        <ReservationStatus>Confirmed On-Line</ReservationStatus>
        <ArriveDate>20070125</ArriveDate>
        <DepartDate>20070130</DepartDate>
        <RateCode>KRGVJRS</RateCode>
        <RateCodeName>Jacuzzi Jr. Suite</RateCodeName>
        <RateCodeType>Internet Rate</RateCodeType>
        <RoomClass>Junior Suite</RoomClass>
        <NumberRooms>1</NumberRooms>
        <NumberOfNights>5</NumberOfNights>
        <Currency>USD</Currency>
        <RoomCost>2000</RoomCost>
        <TaxType>included</TaxType>
        <GuestNames>Zagorsky, Mr. Trent</GuestNames>
        <Adults>2</Adults>
        <Children>0</Children>
        <Infants>0</Infants>
        <RoomPreference>Double</RoomPreference>
        <SmokingPreference>Non Smoking</SmokingPreference>
        <Comments></Comments>
        <ArriveMode>Air</ArriveMode>
        <ArriveDetails>Frontier #46 arrive 10:40am</ArriveDetails>
        <ArriveTransfer>no</ArriveTransfer>
        <DepartureMode></DepartureMode>
        <DepartureDetails></DepartureDetails>
        <DepartureTransfer>no</DepartureTransfer>
        <RateInclusions>Gourmet Inclusive features: All meals, unlimited domestic & selected intl. premium alcoholic & non-alcoholic drinks, day/night activity program, non motorized watersports, scuba diving clinic in pool, live music & shows, use of bicycles, fitness center, sauna & steam room, day/night tennis, room service, in room minibar replenished daily, welcome glass of sparkling wine, all taxes & gratuities. </RateInclusions>
        <SpecialDates></SpecialDates>
        <ReservationEntered>2006-11-13 22:24:57</ReservationEntered>
       </ReservationID>
      </GuestID>
      <AgentMessage></AgentMessage>
      <Currency>USD</Currency>
      <BookingAmount>2000</BookingAmount>
      <DepositPaid>200.00</DepositPaid>
      <DepositPaidDate>20061113</DepositPaidDate>
      <RemainderAmount>1800</RemainderAmount>
      <RemainderDueDate>20061115</RemainderDueDate>
      <PaymentGateway>YOURPAY</PaymentGateway>
      <PaymentTransactionID>48800FC3-455937</PaymentTransactionID>
     </GuestReservationDetails>
    </AgentID>
   </PropertyID>
  </ChainCode>
 </GroupID>
</gkxml>


Aparentemente sólo recibo el campo <action>newres</action> que queda almacenado en $action.

Mi pregunta es, ¿ cómo debería de estructurar la info, porque como verán tiene varias etiquetas de grupo ?

De antemano, muchas gracias por su atención,

Caribesoft
Mensaje Mar Nov 14, 2006 12:24 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Hola:

El primer problema que tienes es que dentro del tag <RateInclusions> tienes los caracteres & que son caracteres especiales y que debes de cambiar por &amp;.

Después de hacer esto ya puedes hacer el parseo de tu XML sin problema y obtendrás un estructura similar a la siguiente:

Perl:
$VAR1 = {
          'export_date' => '20061113',
          'action' => 'newres',
          'export_type' => 'travelly',
          'export_version' => '0.7',
          'GroupID' => {
                       'GroupName' => 'Omega',
                       'id' => 'travelly',
                       'ChainCode' => {
                                      'PropertyID' => {
                                                      'AgentID' => {
                                                                   'AgentIATA' => 'DIREC',
                                                                   'AffiliateAgentCode' => 'delta',
                                                                   'id' => '1',
                                                                   'AgentCTA' => 'Direct Client',
                                                                   'AgentCode' => 'DIRECT',
                                                                   'GuestReservationDetails' => {
                                                                                                'RemainderDueDate' => '20061115',
                                                                                                'BookingAmount' => '2000',
                                                                                                'GuestID' => {
                                                                                                             'FirstName' => 'Trent',
                                                                                                             'Address' => '8385 Frederick Court ',
                                                                                                             'MembershipNumber' => {},
                                                                                                             'City' => 'De Soto',
                                                                                                             'Title' => 'Mr.',
                                                                                                             'PassportNumber' => {},
                                                                                                             'LastName' => 'Zagorsky',
                                                                                                             'id' => '2507',
                                                                                                             'Email' => 'tzagorsky\\@kc.rr.com',
                                                                                                             'PNR' => '2507',
                                                                                                             'Language' => 'en',
                                                                                                             'Nationality' => {},
                                                                                                             'ReservationID' => {
                                                                                                                                'Comments' => {},
                                                                                                                                'RateCodeType' => 'Internet Rate',
                                                                                                                                'NumberOfNights' => '5',
                                                                                                                                'Infants' => '0',
                                                                                                                                'Children' => '0',
                                                                                                                                'ArriveDate' => '20070125',
                                                                                                                                'RateInclusions' => 'Gourmet Inclusive features: All meals, unlimited domestic & selected intl. premium alcoholic & non-alcoholic drinks, day/night activity program, non motorized watersports, scuba diving clinic in pool, live music & shows, use of bicycles, fitness center, sauna & steam room, day/night tennis, room service, in room minibar replenished daily, welcome glass of sparkling wine, all taxes & gratuities.',
                                                                                                                                'RateCode' => 'KRGVJRS',
                                                                                                                                'GuestNames' => 'Zagorsky, Mr. Trent',
                                                                                                                                'TaxType' => 'included',
                                                                                                                                'Adults' => '2',
                                                                                                                                'RoomClass' => 'Junior Suite',
                                                                                                                                'id' => '3373',
                                                                                                                                'ArriveTransfer' => 'no',
                                                                                                                                'DepartureTransfer' => 'no',
                                                                                                                                'RateCodeName' => 'Jacuzzi Jr. Suite',
                                                                                                                                'DepartureMode' => {},
                                                                                                                                'ArriveDetails' => 'Frontier #46 arrive 10:40am',
                                                                                                                                'DepartureDetails' => {},
                                                                                                                                'SmokingPreference' => 'Non Smoking',
                                                                                                                                'SpecialDates' => {},
                                                                                                                                'ReservationEntered' => '2006-11-13 22:24:57',
                                                                                                                                'ReservationNumber' => 'GK3373',
                                                                                                                                'NumberRooms' => '1',
                                                                                                                                'Currency' => 'USD',
                                                                                                                                'RoomCost' => '2000',
                                                                                                                                'DepartDate' => '20070130',
                                                                                                                                'ReservationStatus' => 'Confirmed On-Line',
                                                                                                                                'ArriveMode' => 'Air',
                                                                                                                                'RoomPreference' => 'Double'
                                                                                                                              },
                                                                                                             'Telephone' => '9139098299',
                                                                                                             'Membership' => {},
                                                                                                             'ProvState' => 'ks',
                                                                                                             'MailingList' => 'yes',
                                                                                                             'Country' => 'United States',
                                                                                                             'PostcodeZip' => '66018',
                                                                                                             'CompanyName' => {},
                                                                                                             'Fax' => {}
                                                                                                           },
                                                                                                'DepositPaid' => '200.00',
                                                                                                'PaymentTransactionID' => '48800FC3-455937',
                                                                                                'AgentMessage' => {},
                                                                                                'Currency' => 'USD',
                                                                                                'PaymentGateway' => 'YOURPAY',
                                                                                                'DepositPaidDate' => '20061113',
                                                                                                'RemainderAmount' => '1800'
                                                                                              }
                                                                 },
                                                      'id' => 'KJG6689',
                                                      'PropertyExtID' => {},
                                                      'PropertyName' => 'Omega Spa Resort'
                                                    },
                                      'ChainName' => 'Delta Hotels',
                                      'id' => 'Delta'
                                    }
                     }
        };


Ya con eso podrás ver cómo trabajar con tu variable que en realidad es una referencia a un hash.


Saludos
Mensaje Mar Nov 14, 2006 12:57 pm
caribesoft
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
Gracias ... Responder citando

Como siempre muchas gracias Kidd :

Pero perdón por mi ignorancia. ¿Cuál sería la mejor forma de hacer la substitución de los caracteres & por &amp;?, ¿sería así? :

Perl:
$VAR1 =~ s/&/&amp/


¿¿¿o es una locura ???

saludos,

Caribesoft
Mensaje Mar Nov 14, 2006 2:59 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Hola:

Pues si lo tienes en un string si podrías hacer eso:

Perl:
$VAR =~ s/\&/\&amp;/g;


Ahora, lo mejor sería corregir el problema desde la raíz, es decir en el archivo XML.


Saludos
Mensaje Jue Nov 16, 2006 4:06 pm
caribesoft
Perlero Nuevo
Perlero Nuevo
Registrado: 09 May 2006
Mensajes: 73
Ubicación: Cancun
Tienes razon Responder citando

Hola Kidd :

Tienes razon, el problema viene desde el XML, no es un archivo sino que llega a traves de un POST.
Mi pregunta es :

1. La persona que me esta enviando el POST deberia de corregir su programa que no acepte los simbolos & para formar el XML no crees ?, ya que en realidad genera un error :
Código:

not well-formed (invalid token)
 


2. Conoces alguna forma de poder corregir este POST al momento de recibirlo, he estado probando varias cosas, como del "Subtituir" pero no me funciona .

Los tips son bienvenidos,

Muchas gracias,

Caribesoft
Mensaje Jue Nov 16, 2006 5:40 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Hola:

Si te está mandando un post en una sola variable, entonces tu problema puede estar en los newlines, para ello usa un expresión como la siguiente:

Perl:
$VAR =~ s/\&/\&amp;/mg;


Para mayores detalles acerca de los Regexp en Perl, pues checar en los tutoriales del sitio:
http://perlenespanol.baboonsoftware.com/tutoriales/expresiones_regulares/index.html


Saludps
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group