RE: How to Use XML::Parser to Reduce an XML file to what is wanted

2012-10-31 Thread Clarke, Dave S
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

2012-10-31 Thread Paul Rousseau

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.