Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 246
  • Last Modified:

find a string in a xml file

I need to extract values from a xml file which would look like this
<E Name="E" RdfName="EnumA" Namespace="abc">
                  <Label Label="E"A/>
                  <EnumValue Name="S" RdfName="xyz" Value="1" Namespace="abc"> <Label Label="xyz"/>
</EnumValue>

I need to find E Name="E" stirng and than extract the value of Label Label= and Value=. After extracting the vaues I need ot insert into a table.
could someone help me with this
0
khanzada19
Asked:
khanzada19
  • 7
  • 5
  • 4
1 Solution
 
FishMongerCommented:
0
 
khanzada19Author Commented:
I am not using perl 5.10.0, so I can't use examples from link
0
 
Adam314Commented:
The XML::Simple module, and examples on the link, will work in versions of perl prior to 5.10.0 - as long as it's not to old.  What version of perl are you using?  Did you install the XML::Simple module?
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
khanzada19Author Commented:
I am using  perl, v5.6.0
0
 
FishMongerCommented:
v5.6.0 is a little old, but still within reason, so the current version of XML::Simple should work for you.  However, I'd recommend upgrading to 5.8.8 or 5.10
0
 
khanzada19Author Commented:
becuase of the restriction on upgrade I won't be able to use perl. Dose anyone how to do this oracle PL/SQL.
0
 
Adam314Commented:
You will not need to upgrade your perl in order to use perl with the XML::Simple module.  Have you tried to install the XML::Simple module?  Did it install successfully?  Any errors?
0
 
khanzada19Author Commented:
I can't even install the XML::Simple module, I mean I can install in dev but in prod, so this potion is out. I need to do it with PL/SQL
0
 
Adam314Commented:
This will get the values from your XML file.  It works on the example provided, but there could be XML files that will break it.

As for getting it into a database, what interface do you want to use?  The DBI module is the most common method.  Can you use this?
#if $str contains the above XML (or replace $str here with whatever variable contains the XML)
if($str =~ /E\s+Name="E".*?<Label\s+Label="(.*?)".*?Value="(.*?)"/s) {
	print "Label=$1\nValue=$2\n";
}

Open in new window

0
 
khanzada19Author Commented:
I am doing following, seems like it reading a line at time instead of whole string

open(IN,"foo.xml")
          || die HisTools::output("ERROR: Could not open file $datapoint\n\n");
while ($str = <IN>){
print"\n a = $str\n";
if($str =~ /E\s+Name="E".*?<Label\s+Label="(.*?)".*?Value="(.*?)"/s) {
      print "Label=$1\nValue=$2\n";
}

close("foo.xml");
}
0
 
FishMongerCommented:
You have 2 '<Label Label='  but only 1 'Value=' within '<E Name='
Do you need to extract both Label Label= tags or only one of them?

0
 
khanzada19Author Commented:
I need both 'Label Label='
0
 
Adam314Commented:
The code I gave before will get only the first label.  Also, you need to read the entire file into memory, not one line at a time.  Try this
open(IN,"foo.xml")
  || die HisTools::output("ERROR: Could not open file $datapoint\n\n");
local $/;
my $str = <IN>;
close("foo.xml");
 
if($str =~ /<E\s+Name="E".*?<Label\s+Label="(.*?)".*?Value="(.*?)".*?<Label\s+Label="(.*?)"/s) {
	print "Label1=$1\nValue=$2\nLabel2=$3\n";
}

Open in new window

0
 
khanzada19Author Commented:
we are almost there, just one last thing how to handle if there are multiple entires

Thanks for your help!
0
 
Adam314Commented:

while($str =~ /<E\s+Name="E".*?<Label\s+Label="(.*?)".*?Value="(.*?)".*?<Label\s+Label="(.*?)"/sg) {
	print "Label1=$1\nValue=$2\nLabel2=$3\n";
}

Open in new window

0
 
FishMongerCommented:
Instead of loading the entire file into a scalar, you could loop over it line by line using the flip-flop operator.
while(<DATA>) {
   if ( /<E Name="E"/../<\/E>/ ) {
      if (/<Label Label="(.+?)"/) {
         print "Label=$1\n";
      }
      if (/Value="(.+?)"/) {
         print "Value=$1\n";
      }
   }
}
 
__DATA__
<E Name="E" RdfName="EnumA" Namespace="abc">
                  <Label Label="E"A/>
                  <EnumValue Name="S" RdfName="xyz" Value="1" Namespace="abc"> <Label Label="xyz"/></EnumValue>
                  <Label Label="F"A/>
                  <EnumValue Name="S" RdfName="xyz" Value="2" Namespace="abc"> <Label Label="zyx"/></EnumValue>
</E>

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 7
  • 5
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now