Hello Jenda,    Here is my code so far. use strict;
use Data::Dumper;
use XML::Rules;
$filename = "c:\temp\infile.xml";
$targetfile = "c:\temp\outfile.xml";
 @rules = (_default => 'raw',
          Item => sub {
                       if ($_[1]{_content} =~ /\.Latched/s)   # select only 
Items with the text, ".Latched", in it.
                           {
#                            print $_[0] => $_[1];
                            return $_[0] => $_[1];        # return raw value.
                           }
                       else
                           {
                            delete ($_[1] -> {_content});
print "deleting";
                            return;
                           }
                      }
         );
open my $OUTFILE, '>', $targetfile or die ("can't open $targetfile");my $p2 = 
XML::Rules -> new (rules => \@rules,
                                            style => 'filter'
                        );
$p2 -> XML::Rules::filterfile ($filename, $OUTFILE);
 I have three questions.  (See output farther on.) 1. How do I get the parser 
to not print out blank lines for those items I do not want? I tried deleting 
but I still get a placeholder. 2. How do I not print out the header, <?xml 
version="1.0"?>, at the top of the output file? 3. How do I not print out a new 
line character, making the results all one line? Here is the input file 
content. <Session><Hostname Remote="0" RemoteHost="\\SCADA"><Server 
Name="Kepware.KEPServerEX.V5" Connected="1" GroupCount="1"><Group Name="11-30" 
Active="-1" ReqUpdateRate="10000" TimeBias="-420" PercentDeadband="0.00" 
Connected="2" ItemCount="26283"><Item AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.EY_01_1001</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.Always_Off_Bit</Item><Item 
AccessPath="" Active="-1" ReqDataType="0">11-30.PLC.Global.ANY_ACK</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ANY_RESET</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.BP_ALL_FIRE_Reset</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.BP_ALL_FIRE_Set</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.EY_01_1010B</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.BP_ALL_H2S_Reset</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.BP_ALL_H2S_Set</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.BP_ALL_LEL_Reset</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.BP_ALL_LEL_Set</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.CAL_BYPASS_GRP</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.EY_01_1001</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.EY_01_1010</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.EY_01_1010A</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.EY_01_200</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.EY_01_210</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.EY_01_2110</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.EY_01_2120</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.FD_BYPASS_GRP</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.GD_BYPASS_GRP</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.H2S_BYPASS_GRP</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.HS2_FAN_OFF</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.HS2_FAN_ON</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.I_O_Force_Status</Item><Item 
AccessPath="" Active="-1" ReqDataType="0">11-30.PLC.Global.JWBIT</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.LEL_FAN_OFF</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.LEL_FAN_ON</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.LY_01_1010A</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.LY_01_1010B</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.NY_01_1080</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.NY_01_1110</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.NY_01_1180</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.NY_22_7110</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.NY_22_7120</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.OY_01_1080</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.OY_01_1180</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.PY_01_1001</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.PY_01_1010B</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.PY_01_1110</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.REMOTE_ACK</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.REMOTE_ESD</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.REMOTE_RESET</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.RTU_COMMAND_OUT</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.SY_01_1110</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.TEMP_BYPASS</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.Time_Set_ons</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.Time_Set_Trig</Item><Item 
AccessPath="" Active="-1" ReqDataType="0">11-30.PLC.Global.UL_H2S</Item><Item 
AccessPath="" Active="-1" ReqDataType="0">11-30.PLC.Global.UL_LEL</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.UL_PROCESS</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.ACKNOWLEDGE.Alarmed</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ZSO_01_1110.DigitalAnnunciator.AlarmInput</Item><Item
 AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ZSO_01_1110.DigitalAnnunciator.AlarmPosition</Item><Item
 AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ZSO_01_1110.DigitalAnnunciator.ArrayBitOffset</Item><Item
 AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassStart</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassStatus</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassStop</Item><Item AccessPath="" 
Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimeSetpoint</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.CalloutPosition</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.ClassCEnable</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.ClassCStatus</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.ClassCTimeSetpoint</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.DebounceTimeSetpoint</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.EnableIn</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.ES23_0001.EnableOut</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.InputLatched</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.Latched</Item><Item AccessPath="" 
Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.MotorStatusBypass</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.NonLatched</Item><Item AccessPath="" 
Active="-1" ReqDataType="0">11-30.PLC.Global.ES23_0001.RawInput</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.CTL_x.CTL_00</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.ACC</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.DN</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.EN</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.PRE</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.TT</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.CTL_x.CTL_01</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.CTL_x.CTL_02</Item><Item 
AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.BypassTimer.CTL_x.CTL_03</Item></Group></Server></Hostname></Session>
Here is the result. <?xml version="1.0"?><Session>
<Hostname Remote="0" RemoteHost="\\SCADA">
<Server Name="Kepware.KEPServerEX.V5" Connected="1" GroupCount="1">
<Group Name="11-30" Active="-1" ReqUpdateRate="10000" TimeBias="-420" 
PercentDeadband="0.00" Connected="2" ItemCount="26283">                         
        
<Item AccessPath="" Active="-1" 
ReqDataType="0">11-30.PLC.Global.ES23_0001.Latched</Item>     
</Group>
</Server>
</Hostname>
</Session>
 Thank you. Paul  > From: je...@krynicky.cz
> To: perl-win32-users@listserv.activestate.com
> Date: Thu, 1 Nov 2012 18:20:06 +0100
> Subject: Re: How to Use XML::Parser to Reduce an XML file to what is wanted
> 
> From: Paul Rousseau <paulrousseau...@hotmail.com>
> > I have an .xml file that I want to search for specific items, ignoring the 
> > remaining items.
> > 
> > I want to be able to maintain the .xml file integrity, so I want to open 
> > the original and after finding what I am looking for, dump the results to a 
> > second file.
> >
> > I am thinking I would need logic to do the following.
> >  
> > 1. Open the .xml file.
> > 2. Begin parsing.
> > 3. If the object is not 'Item', keep it. (This will keep objects such as 
> > 'Session', 'Server', 'Group')
> > 4. If the object is 'Item', and it contains the text, '.Latched', keep it.
> > 5. Otherwise, ignore 'Item'
> > 6. Open the output file.
> > 7. Write out all the kept items.
> > 8. Close both files.
> >  
> > Any help would be greatly appreciated.
> >  
> > Paul Rousseau
> >                                       
> 
> See XML::Rules in the filter mode.
> 
> Jenda
> ===== je...@krynicky.cz === http://Jenda.Krynicky.cz =====
> When it comes to wine, women and song, wizards are allowed 
> to get drunk and croon as much as they like.
>       -- Terry Pratchett in Sourcery
> 
> _______________________________________________
> Perl-Win32-Users mailing list
> Perl-Win32-Users@listserv.ActiveState.com
> To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
                                          
_______________________________________________
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to