2012-01-23 14 views
1

私は以下の形式のxmlを持っています。私はHintPathの番号をProject/ItemGroup/Referenceにしたいと思っています。私はまたPrivateノードの番号をノードテキストFalseProject/ItemGroup/Referenceの下に取得する必要があります。 Perlスクリプトでこれをどうすればできますか?特定の値を持つノードをカウントする

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
    <ItemGroup> 
    <Reference Include="IronPython, Version= ..."> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>..\shared\IronPython-1.1\IronPython.dll</HintPath> 
    </Reference> 
    <Reference Include="log4net, Version= ..."> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>..\binaries\log4net.dll</HintPath> 
     <Private>False</Private> 
    </Reference> 
    </ItemGroup> 
</Project> 
+2

あなたのXMLは整形式ではありません。あなたの助けを求める前に、あなたのデータをチェックしてください。ありがとう。 – mirod

+0

@mirod:正しいxmlを更新しました – Manu

答えて

1

あなたがXML::Simple使用することができます。以下は

#!/usr/bin/perl 

use XML::Simple 'XMLin'; 

my $xml = XMLin(join("\n", <DATA>), ForceArray => [ 'Reference' ]); 

foreach my $reference (@{ $xml->{ItemGroup}{Reference} }) 
{ 
    # count the HintPath and Private (where False) elements in $reference 
} 

__DATA__ 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="3.5"> 
    <ItemGroup> 
    <Reference Include="IronPython, Version= ..."> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>..\shared\IronPython-1.1\IronPython.dll</HintPath> 
    </Reference> 
    <Reference Include="log4net, Version= ..."> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>..\binaries\log4net.dll</HintPath> 
     <Private>False</Private> 
    </Reference> 
    </ItemGroup> 
</Project> 
2

は、XML ::小枝を使用したソリューションです。 XML :: LibXMLのようなDOMモジュールも非常によく似た方法で動作します。

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

my $t= XML::Twig->new->parse(\*DATA); 
foreach my $reference ($t->findnodes('/Project/ItemGroup/Reference')) 
    { print "HintPath count: ", $reference->children_count('HintPath'), "\n"; 
    my $private= $reference->descendants('Private[text()="False"]'); 
    print "False Private count: $private\n"; 
    } 

__DATA__ 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
    <ItemGroup> 
    <Reference Include="IronPython, Version= ..."> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>..\shared\IronPython-1.1\IronPython.dll</HintPath> 
    </Reference> 
    <Reference Include="log4net, Version= ..."> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>..\binaries\log4net.dll</HintPath> 
     <Private>False</Private> 
    </Reference> 
    </ItemGroup> 
</Project> 
関連する問題