Convert xml to csv

I need to convert below xml code to csv. I searched other posts as well but this post (_http://www.unix.com/shell-programming-scripting/174417-extract-parse-xml-data-statistic-value-csv.html) gives "sed command garbled" error. As of now I have written a long script to do it, but can it be done with single sed command.??
XML :

<ticketing>     
    <ticketingProduct name="Prod 4">       
        <ticketingEvent>Prod 4 - Event 1</ticketingEvent>     
        <ticketingEvent>Prod 4 - Event 2</ticketingEvent>     
        <ticketingEvent>Prod 4 - Event 3</ticketingEvent>     
    </ticketingProduct> 
    <ticketingProduct name="Prod 3">      
        <ticketingEvent>Prod 3 - Event 1</ticketingEvent>    
        <ticketingEvent>Prod 3 - Event 2</ticketingEvent>    
    </ticketingProduct>
    <ticketingProduct name="Prod 2">      
        <ticketingEvent>Prod 2 - Event 1</ticketingEvent>    
    </ticketingProduct> 
    <ticketingProduct name="Prod 1">      
        <ticketingEvent>Prod 1 - Event 1</ticketingEvent>    
        <ticketingEvent>Prod 1 - Event 2</ticketingEvent>    
    </ticketingProduct>  
</ticketing>

and what i need is

Prod 4,Prod 4 - Event 1
Prod 4,Prod 4 - Event 2
Prod 4,Prod 4 - Event 3
Prod 3,Prod 3 - Event 1
Prod 3,Prod 3 - Event 2
Prod 2,Prod 2 - Event 1
Prod 1,Prod 1 - Event 1
Prod 1,Prod 1 - Event 2

basically its in format ticketingProduc, ticketingEvent
any suggestion is appreciated..

perl -ne '
if (/<ticketingProduct name/../<\/ticketingProduct>/) {
    if (/<ticketingProduct name/) { s/.*?"(.*?)"./$1/; $x = $1 }
    if (/<ticketingEvent>/) { s|<ticketingEvent>(.*?)</ticketingEvent>|$1|; $y = $1; print "$x,$y\n" }
}' inputfile

In nawk ..

$ nawk -F'[<>]' '/<ticketingEvent/{split($3,a,"-");print a[1]","$3}' infile
1 Like

Thanks balajesuri but perl isn't availanle. Sorry I didnt mentioned it before.

Thanks jayan but can you please make me understand this code.?? I am not comfortable with awk. Can this be done with sed command.??
Also i see this code doesnt produce desired output when productname isn't repeating in event name. For-example it doesnt give desired output for below code:

<ticketing>
        <ticketingProduct name="Prod 1">
                <ticketingEvent>Event 1</ticketingEvent>
                <ticketingEvent>Event 2</ticketingEvent>
                <ticketingEvent>Event 3</ticketingEvent>
        </ticketingProduct>
        <ticketingProduct name="Prod 2">
                <ticketingEvent>Event 1</ticketingEvent>
                <ticketingEvent>Event 2</ticketingEvent>
        </ticketingProduct>
        <ticketingProduct name="Prod 3">
                <ticketingEvent>Event 1</ticketingEvent>
                <ticketingEvent>Event 2</ticketingEvent>
                <ticketingEvent>Event 3</ticketingEvent>
        </ticketingProduct>
        <ticketingProduct name="Prod 4">
                <ticketingEvent>Event 1</ticketingEvent>
                <ticketingEvent>Event 2</ticketingEvent>
                <ticketingEvent>Event 3</ticketingEvent>
                <ticketingEvent>Event 4</ticketingEvent>
        </ticketingProduct>
</ticketing>

You don't have Perl!!!!!!!! :eek: Which esoteric *nix system is that, which has awk and not Perl?

dont get angry buddy. What i mean to say is- perl should not be used. It should be ksh only. Its weird but quality gp has set such guidelines...

I'm just kidding mate :smiley: No worries. I understood the meaning of 'perl isnt available' as 'i dont have perl on my system'. My bad.. :stuck_out_tongue:

awk '
    BEGIN { FS="[<>]"; OFS="," }
    /name=/ { sub(/.*="/, "", $2); Name = substr($2, 1, length($2)-1); next }
    $2=="ticketingEvent" { print Name,$3; next }
' inputfile

Jean-Pierre.