rammyp_1979 |
10-25-2010 11:27 AM |
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('transformation error')" 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 ="''" 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('transformation error')" 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 ="''" 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('transformation error')" 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 ="''" 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('transformation error')" 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 ="''" 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');
}
}
}
}
|