get属性值的正则表达式

时间:2013-11-10 07:40:41

标签: regex xml perl

我使用下面的代码来获取正则表达式但不能正常工作..请建议..

<?xml version='1.0'?>
<root>
<category cname='CH1' id='C1'>
<subcat sname='SCName1' sid='SC1'>

我想得到sname&amp; SCID1&amp;的sid属性值SC1。我使用了下面的代码

use File::Slurp;
my $filename='nba.xml';
my @lines = read_file( $filename ) ;
foreach (@lines) {
  $_=~/sname\s*=\s*'([^']+)'.*?sid\s*=\s*'([^']+)'/g;
  print "$1,$2\n";
  $comp1="$1";
  $comp2="$2";
}

提前致谢!!!!!!

2 个答案:

答案 0 :(得分:4)

您需要使用 XML解析器,但不是正则表达式来解析XML!

use XML::LibXML;

my $doc = XML::LibXML->load_xml(string => <<'EOT');
<root>
<category cname='CH1' id='C1'/>
<subcat sname='SCName1' sid='SC1'/>
</root>
EOT

my $xpc = XML::LibXML::XPathContext->new($doc);

my $sname = $xpc->findvalue('//subcat/@sname');
my $sid = $xpc->findvalue('//subcat/@sid');

答案 1 :(得分:1)

我发现了使用正则表达式的另一种方法....

foreach(@lines)
{
    if($_=~/sname\s*=\s*'([^']+)'.*?sid\s*=\s*'([^']+)'/g)
    {
        $scatval="$1";
        if ($scatval eq $subCateGory)
        {
        $scatid="$2";   
        $scat_flag=1;
        }
    }
}