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