LinuxQuestions.org
Review your favorite Linux distribution.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 10-25-2010, 11:27 AM   #1
rammyp_1979
LQ Newbie
 
Registered: Oct 2010
Posts: 6

Rep: Reputation: 0
Perl and Lib::XML usage


Perl GURU's,

I am trying to use Perl and Lib::XML to solve something similar to what I posted on my first thread, that is to conditionally replace XML tags but to preserve the order of the XML (which is why I cannot use XML:Simple)

Consider the following XML

Code:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="10/19/2010 07:15:27" REPOSITORY_VERSION="179.88">
<REPOSITORY NAME="IT_REP" VERSION="179" CODEPAGE="Latin1" DATABASETYPE="DB2">
<FOLDER NAME="CADM" GROUP="" OWNER="Administrator" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r-x" UUID="ad49ad64-d86a-4823-9c04-2d881fe79240">
    <MAPPING DESCRIPTION ="" ISVALID ="YES" NAME ="m_EQ_Hist_Alloc_Attrib_build" OBJECTVERSION ="1" VERSIONNUMBER ="1">
        <TRANSFORMATION DESCRIPTION ="" NAME ="expr_seq_alloc_attrib_id_RPT" OBJECTVERSION ="1" REUSABLE ="NO" TYPE ="Expression" VERSIONNUMBER ="1">
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="" DESCRIPTION ="" NAME ="NEXTVAL" PICTURETEXT ="" PORTTYPE ="INPUT" PRECISION ="19" SCALE ="0"/>
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="IIF(SEQ_START_VAL= 0, (IIF(ISNULL(:LKP.LKP_T_Alloc_Attrib_Seq(1)), 0, :LKP.LKP_T_Alloc_Attrib_Seq(1))), SEQ_START_VAL)" EXPRESSIONTYPE ="GENERAL" NAME ="SEQ_START_VAL" PICTURETEXT ="" PORTTYPE ="LOCAL VARIABLE" PRECISION ="19" SCALE ="0"/>
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="ERROR(&apos;transformation error&apos;)" DESCRIPTION ="" EXPRESSION ="SEQ_START_VAL+NEXTVAL" EXPRESSIONTYPE ="GENERAL" NAME ="OUT_NEXTVAL" PICTURETEXT ="" PORTTYPE ="OUTPUT" PRECISION ="19" SCALE ="0"/>
            <TABLEATTRIBUTE NAME ="Tracing Level" VALUE ="Normal"/>
            <METADATAEXTENSION DATATYPE ="STRING" DESCRIPTION ="" DOMAINNAME ="User Defined Metadata Domain" ISCLIENTEDITABLE ="YES" ISCLIENTVISIBLE ="YES" ISREUSABLE ="NO" ISSHAREREAD ="NO" ISSHAREWRITE ="NO" MAXLENGTH ="256" NAME ="Blank" VALUE ="&apos;&apos;" VENDORNAME ="INFORMATICA"/>
        </TRANSFORMATION>
        <TRANSFORMATION DESCRIPTION ="" NAME ="expr_seq_alloc_attrib_id_REV_HIST" OBJECTVERSION ="1" REUSABLE ="NO" TYPE ="Sequence" VERSIONNUMBER ="1">
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="" DESCRIPTION ="" NAME ="NEXTVAL" PICTURETEXT ="" PORTTYPE ="INPUT" PRECISION ="19" SCALE ="0"/>
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="IIF(SEQ_START_VAL= 0, (IIF(ISNULL(:LKP.LKP_T_Alloc_Attrib_Seq(1)), 0, :LKP.LKP_T_Alloc_Attrib_Seq(1))), SEQ_START_VAL)" EXPRESSIONTYPE ="GENERAL" NAME ="SEQ_START_VAL" PICTURETEXT ="" PORTTYPE ="LOCAL VARIABLE" PRECISION ="19" SCALE ="0"/>
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="ERROR(&apos;transformation error&apos;)" DESCRIPTION ="" EXPRESSION ="SEQ_START_VAL+NEXTVAL" EXPRESSIONTYPE ="GENERAL" NAME ="OUT_NEXTVAL" PICTURETEXT ="" PORTTYPE ="OUTPUT" PRECISION ="19" SCALE ="0"/>
            <TABLEATTRIBUTE NAME ="Tracing Level" VALUE ="Normal"/>
            <METADATAEXTENSION DATATYPE ="STRING" DESCRIPTION ="" DOMAINNAME ="User Defined Metadata Domain" ISCLIENTEDITABLE ="YES" ISCLIENTVISIBLE ="YES" ISREUSABLE ="NO" ISSHAREREAD ="NO" ISSHAREWRITE ="NO" MAXLENGTH ="256" NAME ="Blank" VALUE ="&apos;&apos;" VENDORNAME ="INFORMATICA"/>
        </TRANSFORMATION>
</FOLDER>
</REPOSITORY>
</POWERMART>
I want to change the transformations where the TYPE ="Sequence" and change all DATATYPES in those transformations to "integer" ie the second set of transformation tags. So the above XML should be :-

Code:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE POWERMART SYSTEM "powrmart.dtd">
<POWERMART CREATION_DATE="10/19/2010 07:15:27" REPOSITORY_VERSION="179.88">
<REPOSITORY NAME="IT_REP" VERSION="179" CODEPAGE="Latin1" DATABASETYPE="DB2">
<FOLDER NAME="CADM" GROUP="" OWNER="Administrator" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r-x" UUID="ad49ad64-d86a-4823-9c04-2d881fe79240">
    <MAPPING DESCRIPTION ="" ISVALID ="YES" NAME ="m_EQ_Hist_Alloc_Attrib_build" OBJECTVERSION ="1" VERSIONNUMBER ="1">
        <TRANSFORMATION DESCRIPTION ="" NAME ="expr_seq_alloc_attrib_id_RPT" OBJECTVERSION ="1" REUSABLE ="NO" TYPE ="Expression" VERSIONNUMBER ="1">
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="" DESCRIPTION ="" NAME ="NEXTVAL" PICTURETEXT ="" PORTTYPE ="INPUT" PRECISION ="19" SCALE ="0"/>
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="IIF(SEQ_START_VAL= 0, (IIF(ISNULL(:LKP.LKP_T_Alloc_Attrib_Seq(1)), 0, :LKP.LKP_T_Alloc_Attrib_Seq(1))), SEQ_START_VAL)" EXPRESSIONTYPE ="GENERAL" NAME ="SEQ_START_VAL" PICTURETEXT ="" PORTTYPE ="LOCAL VARIABLE" PRECISION ="19" SCALE ="0"/>
            <TRANSFORMFIELD DATATYPE ="bigint" DEFAULTVALUE ="ERROR(&apos;transformation error&apos;)" DESCRIPTION ="" EXPRESSION ="SEQ_START_VAL+NEXTVAL" EXPRESSIONTYPE ="GENERAL" NAME ="OUT_NEXTVAL" PICTURETEXT ="" PORTTYPE ="OUTPUT" PRECISION ="19" SCALE ="0"/>
            <TABLEATTRIBUTE NAME ="Tracing Level" VALUE ="Normal"/>
            <METADATAEXTENSION DATATYPE ="STRING" DESCRIPTION ="" DOMAINNAME ="User Defined Metadata Domain" ISCLIENTEDITABLE ="YES" ISCLIENTVISIBLE ="YES" ISREUSABLE ="NO" ISSHAREREAD ="NO" ISSHAREWRITE ="NO" MAXLENGTH ="256" NAME ="Blank" VALUE ="&apos;&apos;" VENDORNAME ="INFORMATICA"/>
        </TRANSFORMATION>
        <TRANSFORMATION DESCRIPTION ="" NAME ="expr_seq_alloc_attrib_id_REV_HIST" OBJECTVERSION ="1" REUSABLE ="NO" TYPE ="Sequence" VERSIONNUMBER ="1">
            <TRANSFORMFIELD DATATYPE ="integer" DEFAULTVALUE ="" DESCRIPTION ="" NAME ="NEXTVAL" PICTURETEXT ="" PORTTYPE ="INPUT" PRECISION ="19" SCALE ="0"/>
            <TRANSFORMFIELD DATATYPE ="integer" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="IIF(SEQ_START_VAL= 0, (IIF(ISNULL(:LKP.LKP_T_Alloc_Attrib_Seq(1)), 0, :LKP.LKP_T_Alloc_Attrib_Seq(1))), SEQ_START_VAL)" EXPRESSIONTYPE ="GENERAL" NAME ="SEQ_START_VAL" PICTURETEXT ="" PORTTYPE ="LOCAL VARIABLE" PRECISION ="19" SCALE ="0"/>
            <TRANSFORMFIELD DATATYPE ="integer" DEFAULTVALUE ="ERROR(&apos;transformation error&apos;)" DESCRIPTION ="" EXPRESSION ="SEQ_START_VAL+NEXTVAL" EXPRESSIONTYPE ="GENERAL" NAME ="OUT_NEXTVAL" PICTURETEXT ="" PORTTYPE ="OUTPUT" PRECISION ="19" SCALE ="0"/>
            <TABLEATTRIBUTE NAME ="Tracing Level" VALUE ="Normal"/>
            <METADATAEXTENSION DATATYPE ="STRING" DESCRIPTION ="" DOMAINNAME ="User Defined Metadata Domain" ISCLIENTEDITABLE ="YES" ISCLIENTVISIBLE ="YES" ISREUSABLE ="NO" ISSHAREREAD ="NO" ISSHAREWRITE ="NO" MAXLENGTH ="256" NAME ="Blank" VALUE ="&apos;&apos;" VENDORNAME ="INFORMATICA"/>
        </TRANSFORMATION>
</FOLDER>
</REPOSITORY>
</POWERMART>
I came up with this code below. I seem to be able to identify the Transformation Type, but after that I cannot seem to identify the child nodes to identify the datatype. I am a beginner to Perl so any help would be greatly achieved, even if it looks obvious.

Thank you very much!

Code:
  my $parser = XML::LibXML->new();
  my $tree = $parser->parse_file($inputfile);
  my $root = $tree->getDocumentElement;
  my $sequence = 'Sequence';		
  	
  my $querysequence = '//REPOSITORY/FOLDER/MAPPING/TRANSFORMATION/@TYPE';

my @typenodes = $root->findnodes($querysequence);
   
 foreach my $sequencetransform (@typenodes) {
  	 my $literal = $sequencetransform->to_literal;
   	 #print $literal;
        if ( $literal == 'Sequence' ) {
              print $literal;
		my @datatypenodes = $sequencetransform->findnodes('TRANSFORMFIELD/@DATATYPE');
	       foreach my $sequencetransform_data (@datatypenodes) {
		print "am i here?";
		print Dumper $sequencetransform->findnodes('TRANSFORMFIELD/@DATATYPE');
  	 	#my $literal1 = $sequencetransform_data->to_literal;
		print $literal1;
	 		if ( $literal1 == 'bigint' ) { 
				$sequencetransform_data->setValue('integer'); 

       			}
    		}	
	 }
 }
 
Old 10-25-2010, 08:15 PM   #2
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 454Reputation: 454Reputation: 454Reputation: 454Reputation: 454
Does the module produce a hierarchical data structure representing input XML ? If yes, first dump the data structure in Perl format using
Code:
Data::Dumper
module and post the output here. Then it should be simple to show you how to access and change stuff in the data structure.

...

You might need http://search.cpan.org/~pajas/XML-Li...XML/Parser.pod .

Last edited by Sergei Steshenko; 10-25-2010 at 08:16 PM.
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
XML::Simple usage in perl bharatbsharma Programming 2 05-07-2010 05:57 AM
checking for XML::Parser... configure: error: XML::Parser perl module is required for kornerr Linux - General 11 11-16-2008 07:24 AM
LXer: Learn 10 good XML usage habits LXer Syndicated Linux News 0 05-20-2008 02:11 AM
XML and Perl msvinaykumar Programming 3 08-08-2006 08:16 AM
What packages are needed to generate lib-javox-xml-transform-2.4.1.so, etc. satimis Fedora 0 09-25-2004 09:51 AM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 08:35 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration