use strict; use warnings; use XML::LibXML; my $doc = XML::LibXML::Document->new(); my $root = $doc->createElement("views"); $doc->setDocumentElement($root); while ( ) { chomp; my ( $view_id, $view_name, $param_id, $param_name ) = split /\s+/, $_, 4; # find or create... my ( $view_node ) = $root->findnodes("//view[\@id=$view_id]"); unless ( $view_node ) { $view_node = $doc->createElement("view"); $view_node->setAttribute("name",$view_name); $view_node->setAttribute("id",$view_id); $root->appendChild($view_node); } my $param_node = $doc->createElement("parameter"); $param_node->setAttribute("id", $param_id); $param_name = $doc->createTextNode($param_name); $param_node->appendChild($param_name); $view_node->appendChild($param_node); } print $doc->serialize(1); __DATA__ 123456 all 123 Param 1 123456 all 124 Param 2 123457 detail 125 Param 3 123457 detail 126 Param 4 123457 detail 127 Param 5 123457 detail 128 Param 6