RE: How to Use XML::Parser to Reduce an XML file to what is wanted
This looks like a good application for XML::Twig. The SYNOPSIS for that module shows examples of how to setup handlers for matching and processing an XML file. HTH, Dave Clarke From: perl-win32-users-boun...@listserv.activestate.com [mailto:perl-win32-users-boun...@listserv.activestate.com] On Behalf Of Paul Rousseau Sent: Wednesday, October 31, 2012 1:21 PM To: perl Win32-users Subject: How to Use XML::Parser to Reduce an XML file to what is wanted Hello Users. I have an .xml file that I want to search for specific items, ignoring the remaining items. I have dumped the .xml file using the tree method. Partial results look as follows: $VAR1 = [ 'Session', [ {}, 'Hostname', [ { 'RemoteHost' => 'SCADA', 'Remote' => '0' }, 'Server', [ { 'GroupCount' => '1', 'Connected' => '1', 'Name' => 'Kepware.KEPServerEX.V5' }, 'Group', [ { 'PercentDeadband' => '0.00', 'Connected' => '2', 'TimeBias' => '-420', 'ItemCount' => '26283', 'Active' => '-1', 'ReqUpdateRate' => '1', 'Name' => '11-30' }, 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.EY_01_1001' ], 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.Always_Off_Bit' ], . . . (There are many items so I did not include all of them. . . 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.PSHH_01_1010.ClassCTimer.CTL_x.CTL_11' ] ] ] ] ] ]; 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. As an example, the file has many "Item" entries with the text, 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.ACKNOWLEDGE.Latched' ], I want to be able to parse the original .xml file, find all items that contain the text, '.Latched', and output the results similar to the following: $VAR1 = [ 'Session', [ {}, 'Hostname', [ { 'RemoteHost' => 'SCADA', 'Remote' => '0' }, 'Server', [ { 'GroupCount' => '1', 'Connected' => '1', 'Name' => 'Kepware.KEPServerEX.V5' }, 'Group', [ { 'PercentDeadband' => '0.00', 'Connected' => '2', 'TimeBias' => '-420', 'ItemCount' => '26283', 'Active' => '-1', 'ReqUpdateRate' => '1', 'Name' => '11-30' }, 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.ACKNOWLEDGE.Latched' ], 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.EY_01_1001.Latched' ] ] ] ] ] ]; I checked the Net but did not find an "extraction" example that maintains the .xml integrity. I am thinking I would need logic to do the following. 1. Open the .xml file. 2. Begin parsing. 3. If the objec
How to Use XML::Parser to Reduce an XML file to what is wanted
Hello Users. I have an .xml file that I want to search for specific items, ignoring the remaining items. I have dumped the .xml file using the tree method. Partial results look as follows: $VAR1 = [ 'Session', [ {}, 'Hostname', [ { 'RemoteHost' => 'SCADA', 'Remote' => '0' }, 'Server', [ { 'GroupCount' => '1', 'Connected' => '1', 'Name' => 'Kepware.KEPServerEX.V5' }, 'Group', [ { 'PercentDeadband' => '0.00', 'Connected' => '2', 'TimeBias' => '-420', 'ItemCount' => '26283', 'Active' => '-1', 'ReqUpdateRate' => '1', 'Name' => '11-30' }, 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.EY_01_1001' ], 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.Always_Off_Bit' ], . . . (There are many items so I did not include all of them. . . 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.PSHH_01_1010.ClassCTimer.CTL_x.CTL_11' ] ] ] ] ] ]; 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. As an example, the file has many "Item" entries with the text, 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.ACKNOWLEDGE.Latched' ], I want to be able to parse the original .xml file, find all items that contain the text, '.Latched', and output the results similar to the following: $VAR1 = [ 'Session', [ {}, 'Hostname', [ { 'RemoteHost' => 'SCADA', 'Remote' => '0' }, 'Server', [ { 'GroupCount' => '1', 'Connected' => '1', 'Name' => 'Kepware.KEPServerEX.V5' }, 'Group', [ { 'PercentDeadband' => '0.00', 'Connected' => '2', 'TimeBias' => '-420', 'ItemCount' => '26283', 'Active' => '-1', 'ReqUpdateRate' => '1', 'Name' => '11-30' }, 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.ACKNOWLEDGE.Latched' ], 'Item', [ { 'ReqDataType' => '0', 'AccessPath' => '', 'Active' => '-1' }, 0, '11-30.PLC.Global.EY_01_1001.Latched' ] ] ] ] ] ]; I checked the Net but did not find an "extraction" example that maintains the .xml integrity. 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 ___ Perl-Win32-Users mailing list Perl-Win32-Users@listserv.ActiveState.