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.