Re: How to parse XML content using lwp agent or XML Smart

2014-08-25 Thread angus
Hi Rob,

I am sorry, I somehow missed your response until this evening and in the mean 
time have figured out lots of new ways to have this fail shrug.

Anyway, I looked at your sample and came up with the following updates and it 
works but I am interested to hear your input on how I can improve it.

#!/opt/csw/bin/perl
use strict;
use warnings;

use LWP;
use XML::Smart;
use CGI;

my $ua = LWP::UserAgent-new;
my $q = new CGI;

my $doc = XML::Smart-new();
$doc-{PHC_LOGIN}{USERID} = ‘john.doe';
$doc-{PHC_LOGIN}{USERID}-set_node(1);
$doc-{PHC_LOGIN}{USERPASSWORD} = ‘FAKEPASSWORD;
$doc-{PHC_LOGIN}{USERPASSWORD}-set_node(1);
$doc-{PHC_LOGIN}{PARTNERID} = ‘111';
$doc-{PHC_LOGIN}{PARTNERID}-set_node(1);

$doc-save('passport.xml');

my $sendXML = passport.xml;

my $message=;
open (XML,$sendXML);
while (XML) {
$message .=$_;
}
close XML;

my $webpage =https://example.com/members/LoginNet/AutoLogin.aspx;;

$ua-proxy('https', 'http://proxy.exampe.net:8080/');
my $resp = $ua-post($webpage, Content_Type = 'text/xml', Content = $message);

my $xml = XML::Smart-new($resp-decoded_content);
my $dest = $xml-{PHC_LOGIN}{REDIRECTURL};
print Location: $dest\n\n;


On Aug 22, 2014, at 10:38 AM, Rob Dixon rob.di...@gmx.com wrote:

 On 22/08/2014 11:27, angus wrote:
 Hi,
 
 Hi,
 
 I have some sample code that posts some XML content to an URL using 
 LWP agent and XML Smart.  The response to this comes back as some 
 custom XML.  I now need to try and parse the response and find the 
 REDIRECTURL value and redirect the client to that destination.
 
 I am having issues parsing the output here is what I have tried.
 
 my $response = $ua-post($webpage, Content_Type = 'text/xml', 
 Content = $message); $response-decoded_content;
 
 if ($response-is_success) { my $xml = new XML::Smart( 
 $resonse-content , 'XML::Smart::HTMLParser' ); my $xml = new 
 XML::Smart( $resonse-content , 'html' ); print \n\n 
 FOUND:$xml\n; # comes back with a null value
 
 ## # another 
 attempt below ###
 
 my $response = $ua-post($webpage, Content_Type = 'text/xml', 
 Content = $message); $response-decoded_content;
 
 if ($response-is_success) { my $html = $response-content; while ( 
 $html =~/REDIRECT/g ) { print I found: $1\n; } else { print 
 “nothing found\n”; };
 
 The find the value REDIRECT as the script prints out “I found: “ and 
 not “nothing found” but I need the url value….
 
 Here is a sample of what the xml looks like that I am trying to 
 parse.
 
 PHC_LOGIN\r VERSION3.0/VERSION\r 
 PARTNERID11/PARTNERID\r USERLOGINJohn.doe/USERLOGIN\r 
 ERROR_CODE0/ERROR_CODE\r ERROR_DESCRIPTIONLogin 
 Successful/ERROR_DESCRIPTION\r 
 REDIRECTURLhttps://example.com/cust/login.asp/REDIRECTURL\r 
 /PHC_LOGIN
 
 There are a few problems here. I am concentrating on your first attempt,
 as regular expressions are very rarely an appropriate way of processing XML.
 
 - You need to save the content of the incoming message so that you can
 pass it to the parser, but you have written
 
   $response-decoded_content
 
 in void context, so the result will be just thrown away
 
 - In the line
 
   my $xml = new XML::Smart( $resonse-content ,
 'XML::Smart::HTMLParser' );
 
 you mustn't put the method call in quotation marks.It will try to
 stringify `$response` (which, incidentally, you have misspelled) and
 result in something like
 
   HTTP::Response=HASH(0x2c68544)-content
 
 Plus, to be safe, you should be calling `decoded_content` instead of
 just `content`.
 
 - There is no need to specify a parser in the second parameter unless
 you need specific behaviour, so that line should be
 
   my $xml = XML::Smart-new( $resp-decoded_content )
 
 after which you can simply access the elemetn you need using
 
   $xml-{PHC_LOGIN}{REDIRECTURL}
 
 I have put a semi-complete program below. It needs values for $webpage
 and $message, but the rest of the code is in place, and it runs fine.
 
 HTH,
 
 Rob
 
 
 
   use strict;
   use warnings;
   use 5.010;
 
   use LWP;
   use XML::Smart;
 
   my $ua = LWP::UserAgent-new;
 
   my $webpage = '';
   my $message = '';
 
   my $resp = $ua-post($webpage, Content_Type = 'text/xml', Content =
 $message);
 
   my $xml = XML::Smart-new( $resp-decoded_content );
   say $xml-{PHC_LOGIN}{REDIRECTURL};
 
 **output**
 
   https://example.com/cust/login.asp
 



PerlWizard - A free wizard for automatic Perl software code generation using simple forms

2014-08-25 Thread Richard Bailey
Summary.  PerlWizard http://www.rtbaileyphd.com/perlwizard  quickly
generates front ends for user-friendly Perl scripts for Unix and Windows,
with emphasis on the user interface, managing defaults files, and providing
help.  The generated user interface supplies defaults for unentered options,
validates options, and records options for use as defaults on subsequent
runs of the generated scripts.  This makes PerlWizard scripts much more
interactive and friendly than typical command line programs.  Once
PerlWizard generates the front end, the programmer just needs to go to the
bottom of the generated code and start writing.  No need to worry about how
to set up Getopt::Long http://perldoc.perl.org/Getopt/Long.html  calls,
initialization files, built-in help, log files, etc.  PerlWizard is
available at http://www.rtbaileyphd.com/perlwizard.

Basically, you just need to fill out a few simple forms, click a few
buttons, and you can quickly jump into coding the guts of your script
without bothering with all the boilerplate needed to produce a robust,
user-friendly Perl application.

FYI PerlWizard is a Java application that uses the Freemarker template
engine that reads a Perl template to generate Perl scripts.

 

Best Regards,

R. T. Bailey