LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   Perl and Lib::XML usage (https://www.linuxquestions.org/questions/programming-9/perl-and-lib-xml-usage-840345/)

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(&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');

                              }
                    }       
        }
 }


Sergei Steshenko 10-25-2010 08:15 PM

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 .


All times are GMT -5. The time now is 09:32 AM.