Using shell command need to parse multiple nested tag value of a XML file

I have this XML file -

<gp>
    <mms>1110012</mms>
    <tg>988</tg>
    <mm>LongTime</mm>
    <lv>
        <lkid>StartEle=ONE, Desti = Motion</lkid>
        <kk>12</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Velocity</lkid>
        <kk>2</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Park</lkid>
        <kk>2</kk>
    </lv>
<gp>

<gp>
    <mms>2221100</mms>
    <tg>989</tg>
    <mm>LongVelocity</mm>
    <lv>
        <lkid>StartEle=ONE, Source = Velocity</lkid>
        <kk>772</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Desti = Motion</lkid>
        <kk>900</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Park</lkid>
        <kk>2</kk>
    </lv>
<gp>

Now, I need to first search for "<mm>LongTime</mm>", if found then I have to find for "Desti = Motion" value (which is inside <lkid>StartEle=ONE, Desti = Motion</lkid>) inside the multiple nested sub-tags ... and if that is also found then I finally have to get the value inside the TAG below, which is 12 (<kk>12</kk>).
Please help, using anything - AWK, SED, Grep, anything will do.
Thanks in advance.

You didn't post expected output. So based on some assumptions:

awk -F'[<>]' '
        /<mm>LongTime<\/mm>/ {
                f = 1
        }
        f && /<lkid>/ {
                print $3
                getline
                print $3
                f = 0
        }
' file.xml

Use nawk instead in SunOS/Solaris. Modify as per your requirement.

Your XML is weird. Is it supposed to have two <gp> tags in a row like that, instead of <gp> ... </gp> ?

If the missing </gp> was a mistake, I have a generic awk script to extract XML tags:

$ cat xmlh.awk

BEGIN { RS="<";         FS=">"; ORS="\r\n";

        # Change this to alter how many close-tags in a row are needed
        # before a row of data is printed.
        if(!DEP) DEP=1
        SEP="\t"
        }

# Skip weird XML specification lines or blank records
/^\?/ || /^$/   {       next    }

# Handle close tags
/^[/]/  {
        N=D;    while((N>0) && ("/"STACK[N] != $1))     N--;

        if("/"STACK[N] == $1)   D=(N-1);
        POP++;

        if(POP == DEP)
        {
                if(!HEADER++)
                {
                        split(ARG[1], Z, SUBSEP);
                        printf("%s %s", Z[2], Z[3]);
                        for(N=2; N<=ARG_; N++)
                        {
                                split(ARG[N], Z, SUBSEP);
                                printf("%s%s %s", SEP, Z[2], Z[3]);
                        }

                        printf("\n");
                }

                printf("%s", DATA[ARG[1]]);
                for(N=2; N<=ARG_; N++)
                        printf("%s%s", SEP, DATA[ARG[N]]);
                printf("\n");
        }
        next
}

# Handle open tags
{
        gsub(/^[ \r\n\t]*/, "", $2);    # Whitespace isn't data
        gsub(/[ \r\n\t]*$/, "", $2);
        sub(/\/$/, "", $(NF-1));

        # Reset parameters
        POP=0;

        M=split($1, A, " ");
        STACK[++D]=A[1];

        if((!MAX) || (D>MAX)) MAX=D;    # Save max depth

        # Handle parameters
        Q=split(A[2], B, " ");
        for(N=1; N<=Q; N++)
        {
                split(B[N], C, "=");
                gsub(/['"]/,"", C[2]);

                I=D SUBSEP STACK[D] SUBSEP C[1];
                if(!SEEN++)
                        ARG[++ARG_]=I;

                DATA=C[2];
        }

        if($2)
        {
                I=D SUBSEP STACK[D] SUBSEP "CDATA";
                if(!SEEN++)
                        ARG[++ARG_]=I;

                DATA=$2;
        }
}

$ cat data4.xml

<gp>
    <mms>1110012</mms>
    <tg>988</tg>
    <mm>LongTime</mm>
    <lv>
        <lkid>StartEle=ONE, Desti = Motion</lkid>
        <kk>12</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Velocity</lkid>
        <kk>2</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Park</lkid>
        <kk>2</kk>
    </lv>
</gp>

<gp>
    <mms>2221100</mms>
    <tg>989</tg>
    <mm>LongVelocity</mm>
    <lv>
        <lkid>StartEle=ONE, Source = Velocity</lkid>
        <kk>772</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Desti = Motion</lkid>
        <kk>900</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Park</lkid>
        <kk>2</kk>
    </lv>
</gp>

$ # DEP=2 means 'wait for 2 close tags in a row before printing a row'.
$ awk -f xmlh.awk DEP=2 data4.xml
mms CDATA       tg CDATA        mm CDATA        lkid CDATA      kk CDATA
1110012 988     LongTime        StartEle=ONE, Desti = Motion    12
1110012 988     LongTime        StartEle=ONE, Source = Velocity 2
1110012 988     LongTime        StartEle=ONE, Source = Park     2
2221100 989     LongVelocity    StartEle=ONE, Source = Velocity 772
2221100 989     LongVelocity    StartEle=ONE, Desti = Motion    900
2221100 989     LongVelocity    StartEle=ONE, Source = Park     2

$

Output is tab-separated.

Use nawk on solaris.

You may try, might not be intelligent as one Corona posted, but for given sample it works.

awk '
    !f && /<(.*)>$/{
                     s=$0; f=g=1
                     gsub(/</,"</",s)
                     next
                   }
                 f{
                     g=(/<(.*)>/ && !/<\/(.*)>$/)?0:g
                     if(/\<(.*)>(.*)<\/(.*)>/){
                                                  gsub(/[<>]|<\//,"|")
                                                  split($0,A,"|")
                                                  com = g == 1 ? com ? com OFS A[3] : A[3] : com
                                                  dat = g == 0 ? dat ? dat OFS A[3] : A[3] : dat 
                                                  hea = m ? hea : hea ? hea OFS A[2]"_CDATA" : A[2]"_CDATA"
                                              }
                      if(/<\/(.*)>$/ && $0!~s){
                                             ++d
                                             if(d==count){
                                                           print m ? com OFS dat : hea RS com OFS dat
                                                           dat="";d=0;m=1
                                                         }  
                                              }
                   }
               $0~s{
                       f=s=com=d=""
                   }
     ' count="1" OFS="\t" test.xml
$ cat test.xml
<gp>
    <mms>1110012</mms>
    <tg>988</tg>
    <mm>LongTime</mm>
    <lv>
        <lkid>StartEle=ONE, Desti = Motion</lkid>
        <kk>12</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Velocity</lkid>
        <kk>2</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Park</lkid>
        <kk>2</kk>
    </lv>
</gp>

<gp>
    <mms>2221100</mms>
    <tg>989</tg>
    <mm>LongVelocity</mm>
    <lv>
        <lkid>StartEle=ONE, Source = Velocity</lkid>
        <kk>772</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Desti = Motion</lkid>
        <kk>900</kk>
    </lv>
    <lv>
        <lkid>StartEle=ONE, Source = Park</lkid>
        <kk>2</kk>
    </lv>
</gp>
mms_CDATA  tg_CDATA  mm_CDATA       lkid_CDATA            kk_CDATA
1110012    988       LongTime        StartEle=ONE, Desti = Motion       12
1110012    988       LongTime        StartEle=ONE, Source = Velocity    2
1110012    988       LongTime        StartEle=ONE, Source = Park        2
2221100    989       LongVelocity    StartEle=ONE, Source = Velocity    772
2221100    989       LongVelocity    StartEle=ONE, Desti = Motion       900
2221100    989       LongVelocity    StartEle=ONE, Source = Park        2